我有一堆用于 VS2017 的 C++ 项目 (.vcxproj),它们生成动态库 (DLL),它们像“插件”一样处理(即它们由应用程序动态加载)。
有时我想根据文本文件中的某些列表更改生成的 DLL 名称(格式可能会更改):
ProjName1;DLL1
ProjName2;DLL2
...
第一列指定项目名称 ( $(ProjectName)
),第二列指定所需的 DLL 名称 ( $(TargetName)
)。
我希望在构建时解析这个文件,所以每个读取的 DLL 名称都会进入$(OutputFile)
相应的项目。
例如,ProjName1.vcxproj
将有以下片段(在构建时):
<Link>
<OutputFile>$(OutDir)DLL1$(TargetExt)</OutputFile>
</Link>
我想,某些功能msbuild
可以用于此(例如,ReadLinesFromFile 任务和FindInList 任务),但我不知道如何将这些部分放在一起)。
有一些这样的自动化示例需要考虑,尽管我怀疑它们与 .vcxproj 格式相关:
直接的方法是修改每个 .vcxproj 文件的内容以匹配列表(手动或使用某些脚本)。
还有其他选择吗?
更新 1:我设法实现了一个部分解决方案,该解决方案基于每个项目的 DLL 名称(模块名称)的单独文件(有关更多提示,请参阅属性函数)。
在我的情况下,使用属性表很容易将修复“注入”到所有项目中:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<PropertyGroup Condition="exists('$(MSBuildProjectDirectory)\_MODULE.name')">
<ModuleName>$([System.IO.File]::ReadAllText('$(MSBuildProjectDirectory)\_MODULE.name'))</ModuleName>
<TargetName>$(ModuleName)</TargetName>
</PropertyGroup>
...
</Project>
虽然效果很好,但该方法并不能完全满足我的需求——我希望将所有模块名称放在一个文件中。