如何使用MSBuild将AssemblyVersion写入文件?

3

最终修改:尽管相对路径在第一个帖子中无法工作,但如果我从Exec行中简单地删除$(MsBuildThisFileDirectory),则可以工作。

编辑2:我将新目标添加到了DefaultTargets中。它们现在默认运行。然而,后期构建命令的时间不对了。我将<Exec Command="call $(MsBuildThisFileDirectory)documentation\tools\GenerateDocumentation.bat" IgnoreExitCode="false" />添加到该目标中,但它会出现错误,指出C:\Users\my不是有效的批处理文件,因为其中的空格实际上是C:\Users\my program\documentation\tools\GenerateDocumentation.bat。在路径周围加上引号会给我带来错误MSB4025,名称不能以$开头。

编辑:我尝试了stijn的代码,当我使用/t:RetrieveIdentities从命令行显式运行它时,它可以工作,但由于某种原因,否则它似乎无法运行。

我一直在使用Doxygen生成我的源代码文档,但我希望能够自动执行此操作。我编写了一个简单的.bat脚本,使用我的所需配置文件运行Doxygen,并将输出编译为一个.chm帮助文件,但我无法自动更改Doxygen中的修订号。

我试图简单地通过使用MSBuild向配置文件添加一行新的修订号来更新配置文件,但是当没有文件存在时,我无法使任何内容打印出来或创建新文件。

到目前为止,我所拥有的代码都是从其他类似问题中获取的,但我似乎无法使它工作。

<ItemGroup>
  <MyTextFile Include="\documentation\DoxygenConfigFile.doxyconfig"/>
  <MyItems Include="PROJECT_NUMBER         = %(MyAssemblyIdentitiesAssemblyInfo.Version)"/>
</ItemGroup>
<Target Name="RetrieveIdentities">
  <GetAssemblyIdentity AssemblyFiles="bin\foo.exe">
    <Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities"/>
  </GetAssemblyIdentity>
  <WriteLinesToFile File="@(MyTextFile)" Lines="@(MyItems)" Overwrite="false" Encoding="UTF8" />
</Target>

1
将来请在您的问题中包含msbuild输出/错误等信息,仅说“它不起作用”是不清楚的。此外,最好能够复制/粘贴您发布的脚本代码,运行它并查看出了什么问题。 - stijn
1个回答

1
  1. 编码 错误,应该是 UTF-8
  2. 在处理项/属性时,%@$ 必须直接放在 ( 前面,中间不能有空格:%(MyAssemblyIdentitiesAssemblyInfo.Version)
  3. MyAssemblyIdentitiesAssemblyInfo 不存在,你可能想说的是 MyAssemblyIdentities
  4. 查看 msbuild 如何评估属性和项。基本上,它将在脚本中评估 MyItems,但此时 MyAssemblyIdentities 尚不存在,因此为空,只有在执行 GetAssemblyIdentity 之后才会创建。通过强制正确的评估顺序来修复此问题:将您的项放置在目标内,并使其依赖于在评估您的项之前创建 MyAssemblyIdentities 的另一个目标。

总结一下:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="GetAssemblyIdentities">
  <GetAssemblyIdentity AssemblyFiles="bin\foo.exe">
    <Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities"/>
  </GetAssemblyIdentity>
</Target>

<Target Name="RetrieveIdentities" DependsOnTargets="GetAssemblyIdentities">
  <ItemGroup>
    <MyTextFile Include="\documentation\DoxygenConfigFile.doxyconfig"/>
    <MyItems Include="PROJECT_NUMBER = %(MyAssemblyIdentities.Version)"/>
  </ItemGroup>
  <WriteLinesToFile File="@(MyTextFile)" Lines="@(MyItems)"
                    Overwrite="false" Encoding="UTF-8" />
</Target>

</Project>

请注意,这仅在您调用脚本所在的目录中使用msbuild时才有效,否则路径(documentation / foo)将不正确。可以通过使用例如 $(MsBuildThisFileDirectory)\ bin \ foo.exe 来解决这个问题。

  1. 我最初尝试了那个,似乎没有什么区别。
  2. 对不起,我可能粘贴错了,代码中是正确的。
  3. 我完全忽略了那个。
由于某种原因,它仍然没有打印到文件中。当我在目录中更改文件名时,MSBuild会抛出找不到的错误,否则不会出现任何错误,并且不会打印到文件中。谢谢!
- Z Naught
没有正确的编码,错误信息是error MSB3098: "WriteLinesToFile" 任务接收到“Encoding”参数的无效值??无论如何,我在我的系统上测试了以上内容,并且它按预期工作,所以如果它对你不起作用,你必须提供更多信息。请更新你的问题,准确说明你尝试了什么,输出结果是什么。另外,如果在msbuild中出现问题,请使用<Message Text="..."/>来显示属性/项的值作为调试辅助。 - stijn
我终于弄清楚如何让“Exec”命令起作用了。你知道为什么我在原始示例中不能使用相对路径,但必须在“Command”中使用吗?感谢您的帮助! - Z Naught
可能与Exex启动单独的进程有关。您始终可以使用该特定问题开始新问题。 - stijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接