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));
}