visitCSProj()

in lib/generator.js [2836:2950]


  visitCSProj(uniqueUsed) {
    let csprojPath = path.join(this.csprojOutputDir, (this.config.packageInfo.name || 'client') + '.csproj');
    let json = {};
    // 保留本地已有的包
    if (!fs.existsSync(csprojPath)) {
      json = parse(fs.readFileSync(path.join(__dirname, 'files', 'csproj.tmpl')));
    } else {
      json = parse(fs.readFileSync(csprojPath));
    }

    //填写包的基本信息
    let propertyGroup = json.Project.PropertyGroup;
    let assemblyInfo = this.release.split(':');
    propertyGroup.forEach((property) => {
      if (Object.hasOwn(property, 'RootNamespace')) {
        property['RootNamespace'] = this.config.namespace;
        if (this.config.packageInfo && this.config.packageInfo.company) {
          property['Authors'] = this.config.packageInfo.company;
        } else if (this.config.maintainers && this.config.maintainers.name) {
          property['Authors'] = this.config.maintainers.name;
        }
        if (this.config.packageInfo && this.config.packageInfo.description) {
          property['Description'] = this.config.packageInfo.description;
        }
        if (this.config.packageInfo && this.config.packageInfo.property) {
          Object.assign(property, this.config.packageInfo.property);
        }
      }
      if (Object.hasOwn(property, 'AssemblyName')) {
        property['AssemblyName'] = assemblyInfo[0];
      }
      // 支持 packageInfo 中配置当前包发布的版本(之前是<Version/>)
      if (Object.hasOwn(property, 'Version') && this.packageVersion) {
        property['Version'] = this.packageVersion;
      }
    });

    let dependenciesClass = [];
    if (uniqueUsed.includes('Newtonsoft.Json')) {
      dependenciesClass.push('Newtonsoft.Json:13.0.1');
    }
    Object.keys(this.imports).forEach((key) => {
      if (!this.imports[key].release) {
        return;
      }
      dependenciesClass.push(this.imports[key].release);
    });

    if (this.typedef) {
      Object.keys(this.typedef).map(key => {
        if (!this.typedef[key].package) {
          return;
        }
        dependenciesClass.push(this.typedef[key].package);
      });
    }

    // 兜底依赖 Darabonba 的 1.0.0 版本
    const teaVersion = '1.0.0';
    dependenciesClass.push(`Darabonba:${teaVersion}`);

    //寻找用来写入的itemGroup, 避开有特殊参数的itemGroup
    let itemGroup = json.Project.ItemGroup;
    let writeItem = {};
    itemGroup.forEach((item) => {
      if (!item.$) {
        writeItem = item;
      }
    });

    let newDependenciesClass = [];
    if (this.packageManager) {
      const needAddPackages = Object.entries(this.packageManager || {}).map(([key, value]) => `${key}:${value}`);
      const needAddPackageName = new Set(needAddPackages.map(item => item.split(':')[0]));
      newDependenciesClass = [...needAddPackages];
      dependenciesClass.forEach(item => {
        const [pkgName] = item.split(':');
        if (!needAddPackageName.has(pkgName)) {
          newDependenciesClass.push(item);
        }
      });
    } else {
      newDependenciesClass = dependenciesClass;
    }

    //添加或更新依赖包
    newDependenciesClass.forEach((item, index) => {
      if (item) {
        let dependency = item.split(':');
        //遍历所有的itemGroup,判断是否已存在该依赖
        let writeReference = null;
        itemGroup.forEach((group) => {
          if (group.PackageReference) {
            group.PackageReference.forEach((reference) => {
              if (reference.$.Include === dependency[0]) {
                writeReference = reference;
              }
            });
          }
        });
        if (writeReference) {
          writeReference.$.Version = dependency[1];
        } else {
          writeReference = {};
          writeItem.PackageReference = writeItem.PackageReference || [];
          writeReference.$ = { 'Include': dependency[0], 'Version': dependency[1] };
          writeItem.PackageReference.push(writeReference);
        }
      }
    });

    const builder = new xml2js.Builder();
    const newCsproj = builder.buildObject(json);
    fs.writeFileSync(csprojPath, Entities.decode(newCsproj));
  }