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

时间:2013-07-16 22:23:34

标签: version-control msbuild doxygen

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>

1 个答案:

答案 0 :(得分:1)

  1. Encoding错了,应该是UTF-8
  2. 使用项目/属性时,%@以及$必须位于(之前,两者之间没有间距:%(MyAssemblyIdentitiesAssemblyInfo.Version) < / LI>
  3. MyAssemblyIdentitiesAssemblyInfo不存在,您可能需要MyAssemblyIdentities
  4. 查看msbuild如何评估属性和项目。基本上它在脚本中的作用是评估MyItems,但那时MyAssemblyIdentities尚不存在,所以是空的,只有在GetAssemblyIdentity执行之后。通过强制执行正确的评估顺序来解决此问题:将您的项目放在目标中,并在评估项目之前使其依赖于另一个创建MyAssemblyIdentities的目标。
  5. 总结:

    <?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

    来解决