10

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

<Import Project="MyTargets.targets"/>

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

这可能吗?

4

4 回答 4

9

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

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

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

第二个:

$(CustomBeforeMicrosoftCSharpTargets)
$(CustomAfterMicrosoftCSharpTargets)

属性名称很容易解释。

只需通过 msbuild.exe 将完整文件名传递给任何此属性,例如

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

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

于 2013-08-18T13:09:15.863 回答
3

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

  • 目录.Build.props
  • Directory.Build.targets

备注:一旦找到 props 或 targets 文件,MSBuild 将停止寻找父文件。

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

于 2017-09-13T14:58:22.977 回答
0

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

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

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

msbuild.exe Project.msbuild /p:TargetToImport="TargetFile.Target"
于 2013-08-15T21:50:43.487 回答
0

确保使用目标文件的绝对路径并且它可以工作。
资料来源:Sayed Ibrahim Hashimi - MSBuild 如何在 CoreCompile 第 2 部分之后执行目标

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

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

您不必修改任何csproj文件vbproj
当然,它只适用于可以设置 MSBuild 属性的地方。

于 2017-06-16T12:48:23.410 回答