FinalEdit:尽管相对目录在第一篇文章中不起作用,但如果我简单地删除 $(MsBuildThisFileDirectory)
它就起作用了来自 Exec
线。
Edit2:我将新目标添加到 DefaultTargets
.现在默认运行它们。但是,现在使用 postbuild 命令计时已经结束。我添加了 <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>
最佳答案
编码
错误,应该是UTF-8
- 在处理项目/属性时,
%
和@
和$
必须位于(
, 中间没有空格:%(MyAssemblyIdentitiesAssemblyInfo.Version)
MyAssemblyIdentitiesAssemblyInfo
不存在,您可能是说MyAssemblyIdentities
- 了解 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
)
关于version-control - 如何使用 MSBuild 将 AssemblyVersion 写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17688009/