5

我有一个 MSBuild 脚本,除了我的构建后步骤之外,它只是做我需要它做的所有事情(请参阅我之前提出的一个问题:MSBuild conditional Exec?)。

我要做的是构建许多 csproj 文件,并且当且仅当项目已构建时可选地执行构建后步骤。我不想一直执行我的构建后步骤,否则我最终输出的时间戳将被不必要地修改(并且它无缘无故地使构建过程非常耗时)。

在我的 MSBuild 脚本中,我的每个 csproj 文件都有以下内容:

<Target Name="ProjectName">
   <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>

编辑: 我认为我真正想做的是检测 CoreCompile 任务何时为每个项目运行。如果有某种方法可以检查这种情况?

有任何想法吗?

我是 MSBuild 的新手,所以也许我完全走错了路!

谢谢,艾伦

4

3 回答 3

4

您也可以根据构建过程中选择的配置来执行此操作。对于 CI,您应该始终使用“发布”或“生产”(您可以定义自己的)。

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/>
于 2014-02-28T01:13:32.300 回答
1

在为这个问题寻找一个简单的解决方案之后,我没有找到一个,最终想出了一个我自己的解决方案,但可能不是最好的解决方案。但是,我想与遇到相同问题的其他人分享它,以便您至少可以找到一个可行的解决方案,并希望为您节省很多麻烦。

回顾一下,我想做的是在我的项目构建后运行一个命令行工具,但前提是程序集已更新(即时间戳已更改)。我不想把它放到每个项目的后期构建部分,因为我只希望后期构建发生在我们的构建服务器(而不是开发机器)上。

我没有在我的主 .proj 文件中找到任何外部执行此操作的方法,并且最终更改了每个 .csproj 文件的构建后部分。但是,我在它前面加上了一个类似这样的 if 条件:

if '$(ExecuteCommand)' == 'true' command.exe

这意味着该命令将永远不会在开发机器上执行,但是当我从我的 .proj 文件调用构建时,我可以像这样将该标志设置为 true:

<!-- Define common properties -->
<PropertyGroup>
    <ExecuteCommand>true</ExecuteCommand>
</PropertyGroup>

<Target Name="YourTarget">
    <!-- Build project -->
    <MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" />
</Target>

正如我所说,我认为这不是最优雅的解决方案,但它确实有效并且暂时对我来说足够了。但是,我仍然很想知道实现这一目标的正确方法是什么,以便我可以改进我的脚本。

谢谢,艾伦

于 2010-11-28T20:46:36.160 回答
0

如果您可以将以下内容添加到每个项目中:

<Target Name="DoStuffWithNewlyCompiledAssembly">
    <Exec Command="command.exe" />
</Target>

...那么您只需要添加一个属性:

<Target Name="Name">
  <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" />
</Target>

CoreCompile这是有效的,因为微软的某个聪明人在目标末尾添加了以下行Microsoft.[CSharp|VisualBasic][.Core].targets(文件名取决于语言和 MSBuild/Visual Studio 版本)。

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

TargetsTriggeredByCompilation因此,如果您在属性中指定目标名称,则目标将在运行时CoreCompile运行——如果被跳过,您的目标将不会运行CoreCompile(例如,因为输出程序集相对于代码已经是最新的)。

于 2018-01-04T20:01:49.890 回答