Ala*_*ark 5 c# msbuild csproj post-build
我有一个MSBuild脚本,除了我的后期构建步骤之外,还要做我需要做的所有事情(请参阅我之前提出的问题:MSBuild条件Exec?).
我正在寻找的是构建许多csproj文件,并且当且仅当项目构建时,可选择执行构建后步骤.我不想一直执行我的后期构建步骤,否则我的最终输出上的时间戳将被不必要地修改(并且它使得构建过程非常耗时而无缘无故).
在我的MSBuild脚本中,我为每个csproj文件提供了以下内容:
<Target Name="ProjectName">
<MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
编辑: 我认为我真正想做的是检测CoreCompile任务何时为每个项目运行.如果在某种情况下有某种方法来检查这个问题?
有任何想法吗?
我是MSBuild的新手,所以也许我完全走错了轨道!
谢谢,艾伦
您还可以根据构建过程中选择的配置来执行此操作。对于 CI,您应该始终使用“发布”或“生产”(您可以定义自己的)。
<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/>
Run Code Online (Sandbox Code Playgroud)
经过多次寻找这个问题的简单解决方案后,我没有找到一个解决方案,最终提出了我自己的解决方案,该解决方案可行,但可能不是最好的解决方案。但是,我想与遇到同样问题的其他人分享它,以便您至少可以找到一个可行的解决方案,并希望为您省去很多麻烦。
回顾一下,我想做的是在项目构建后运行命令行工具,但前提是程序集已更新(即时间戳发生更改)。我不想将其放入每个项目的构建后部分,因为我只希望构建后发生在我们的构建服务器(而不是开发机器)上。
我在主 .proj 文件中没有找到任何外部执行此操作的方法,并且最终更改了每个 .csproj 文件的构建后部分。但是,我在它前面加上了一个 if 条件,如下所示:
if '$(ExecuteCommand)' == 'true' command.exe
Run Code Online (Sandbox Code Playgroud)
这意味着该命令永远不会在开发计算机上执行,但是当我从 .proj 文件调用构建时,我可以将该标志设置为 true,如下所示:
<!-- Define common properties -->
<PropertyGroup>
<ExecuteCommand>true</ExecuteCommand>
</PropertyGroup>
<Target Name="YourTarget">
<!-- Build project -->
<MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
正如我所说,我不认为这是最优雅的解决方案,但它确实有效,并且暂时对我来说足够了。然而,我仍然有兴趣了解实现这一目标的正确方法是什么,以便我可以改进我的脚本。
谢谢,艾伦