0

我有一堆用于 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>

虽然效果很好,但该方法并不能完全满足我的需求——我希望将所有模块名称放在一个文件中。

4

1 回答 1

0

经过一些调查和试用,我终于设法为我的案例制定了一个可行的解决方案。基本上它是通过使用Regex的魔力建立在我之前的部分解决方案之上的。在类似问题的另一个答案中找到了如何在我的上下文中处理正则表达式的提示。

我还根据自己的喜好调整了列表格式:

DLL1=ProjName1
DLL2=ProjName2
...

我已将更改放在属性表中,因此所有相关项目都可以轻松获取它们:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
  <PropertyGroup Condition="exists('$(MSBuildThisFileDirectory)..\_MODULES.txt')">
    <ModulesNames>$([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\_MODULES.txt'))</ModulesNames>
    <ModuleName>$([System.Text.RegularExpressions.Regex]::Match($(ModulesNames), '\W?(\w*)\W?=\W?$(MSBuildProjectName)\W?').get_Groups().get_Item(1))</ModuleName>
    <TargetName>$(ModuleName)</TargetName>
  </PropertyGroup>
...
</Project>

如果项目未在 中列出_MODULES.txt$(TargetName)则不受影响。

如果您$(ModuleName)在项目设置中看到,那么一切都已正确调整: VS2017项目设置

该解决方案似乎工作正常,除了一个小缺点:构建系统(VS2017 v.15.9.15)在解决方案打开时检测更改非常“懒惰” _MODULES.txt,因此您必须关闭它并重新打开。在您更改列表后,很有可能需要重建。

于 2019-09-20T22:23:56.407 回答