从msbuild中的命令行导入.targets文件

时间:2013-08-15 08:36:10

标签: command-line msbuild target

我目前正在使用msbuild构建多个项目。我对由.targets文件处理的构建进行了一个小的自定义。一种解决方案是添加代码段

<Import Project="MyTargets.targets"/>

到每个项目文件。但是,理想情况下我不想触摸项目文件,并能够将此信息作为参数传递给msbuild。这样我就可以轻松控制是否从命令行运行此自定义,我不必触及现有的项目文件。

这可能吗?

4 个答案:

答案 0 :(得分:5)

您可以使用MSBuild 4.0轻松完成此操作(通过顶级属性 ToolsVersion =“4.0”检查您的版本):

在加载Common.targets和/或CSharp.targets之前和之后,您可以使用多个属性来导入目标。

最简单的方法是使用2组自解释属性。 第一套是:     $(CustomBeforeMicrosoftCommonTargets)     $(CustomAfterMicrosoftCommonTargets)

和第二个:

$(CustomBeforeMicrosoftCSharpTargets)
$(CustomAfterMicrosoftCSharpTargets)

属性名称非常自我解释。

只需通过msbuild.exe将完整文件名传递给任何此属性即可 e.g。

msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets=c:\mytargets\custom.targets

如果您需要导入多个文件,可以使用其他“ImportByWildcard(Before | After)....”属性。但在这种情况下,您需要将更多参数传递给命令行。

答案 1 :(得分:2)

从MSBuild 15.0开始,以下两个文件会自动导入到您的构建中,以防它们在项目路径或根目录路径上的任何父文件夹中找到:

  • Directory.Build.props
  • Directory.Build.targets

备注:一旦找到道具或目标文件,MSBuild将停止寻找父母。

另见:https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

答案 2 :(得分:0)

假设您有一个名为“Project.msbuild”的项目文件。您可以添加此条件导入:

<Import Project="$(TargetToImport)" Condition="'$(TargetToImport)' != ''" />

然后将要导入的目标文件的名称作为msbuild属性传递:

msbuild.exe Project.msbuild /p:TargetToImport="TargetFile.Target"

答案 3 :(得分:0)

确保对目标文件使用绝对路径,然后才能正常工作 来源:Sayed Ibrahim Hashimi - MSBuild how to execute a target after CoreCompile part 2

msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets="c:\mytargets\custom.targets" /preprocess:out.xml

使用/preprocess[:filepath]查看导入结果。

您无需修改​​任何csprojvbproj个文件 当然,它只适用于您可以设置MSBuild属性的地方。