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

Version control 如何使用MSBuild将AssemblyVersion写入文件?,version-control,msbuild,doxygen,Version Control,Msbuild,Doxygen,FinalEdit:尽管相对目录在第一篇文章中不起作用,但如果我只是从Exec行中删除$(MsBuildThisFileDirectory),它就起作用了 编辑2:我将新目标添加到DefaultTargets。现在默认情况下运行它们。然而,postbuild命令现在已经停止计时。我向目标添加了,但它给出了一个错误,即C:\Users\my不是有效的批处理文件,因为实际的空间是C:\Users\my program\documentation\tools\GenerateDocumentation

FinalEdit:尽管相对目录在第一篇文章中不起作用,但如果我只是从
Exec
行中删除
$(MsBuildThisFileDirectory)
,它就起作用了

编辑2:我将新目标添加到
DefaultTargets
。现在默认情况下运行它们。然而,postbuild命令现在已经停止计时。我向目标添加了
,但它给出了一个错误,即
C:\Users\my
不是有效的批处理文件,因为实际的空间是
C:\Users\my program\documentation\tools\GenerateDocumentation.bat
。在路径周围加引号会导致错误
MSB4025
,该名称不能以
$
开头

编辑:我已经尝试过stijn的代码,当我使用/t:RetrieveIdentity从命令行显式运行它时,它就可以工作了,但由于某些原因,它似乎无法在其他情况下运行

我一直在使用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
    之后才能执行。通过强制执行正确的计算顺序来解决此问题:放置项目在目标内部,并使其在评估项目之前依赖于另一个创建
    MyAssemblyIdentity
    的目标
  • 总结如下:

    <?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)将错误。这可以通过使用eg
    $(MsBuildThisFileDirectory)\bin\foo.exe

    来解决,将来让您的问题包括msbuild输出/错误等,只是说“它不起作用”是不清楚的。理想情况下,用户应该能够复制/粘贴您发布的脚本代码,运行它,并查看出了什么问题。1。我本来就试过了,似乎没什么不同。2.很抱歉,我一定把粘贴弄乱了,代码中的粘贴是正确的。3.我完全错过了。由于某些原因,它仍然没有打印到文件中。当我更改目录中文件的名称时,MSBuild会抛出一个找不到该文件的错误,否则将找不到错误,并且不会向该文件打印任何内容。谢谢1.如果编码不正确,则错误消息为
    错误MSB3098:“WriteListFile”任务收到的“encoding”参数值无效??不管怎样,我在我的系统上测试了上述内容,它按预期工作,因此,如果它无法正常工作,您必须提供更多信息。请更新您的问题,确切说明您尝试了什么,以及输出是什么。另外,如果在msbuild中不起作用,请使用
    显示属性/项的值作为调试辅助。我终于找到了如何使
    Exec
    命令起作用的方法。您知道为什么在我的原始示例中不能使用相对路径,但必须将其用于
    命令
    ?谢谢你的帮助!可能与启动一个单独的进程有关。你总是可以用这个特定的问题开始一个新的问题。