gpt4 book ai didi

msbuild - 如何忽略相应 csproj 文件中命令行上给出的属性值?

转载 作者:行者123 更新时间:2023-12-02 15:51:15 24 4
gpt4 key购买 nike

我们的 TFS 构建 Controller 将同一解决方案中的所有项目构建到同一共享 bin 目录中,因为 TFS 构建工作流程将 OutDir 参数传递给负责构建解决方案的 msbuild 命令。

我有一个项目,我想抑制此行为并让它构建到标准相对 bin\Debugbin\Release 目录中。

但我找不到该怎么做。事实上,请观察以下简单的 msbuild 脚本:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutDir>$(MSBuildThisFileDirectory)bin\$(Configuration)</OutDir>
</PropertyGroup>
<Target Name="Build">
<Message Text="$(OutDir)" Importance="High"/>
</Target>
</Project>

现在,我正在运行它:

PS C:\> msbuild .\1.csproj /p:OutDir=XoXo /nologo
Build started 11/13/2015 9:50:57 PM.
Project "C:\1.csproj" on node 1 (default targets).
Build:
XoXo
Done Building Project "C:\1.csproj" (default targets).


Build succeeded.
0 Warning(s)
0 Error(s)

Time Elapsed 00:00:00.03
PS C:\>

注意它显示XoXo,忽略我从内部覆盖它的尝试。

那么,这可能吗?

最佳答案

这是一个有点经典的 RTFM 情况,但仍然很有趣。请参阅 MSBuild Properties 的文档特别是 Global Properties 的部分以及如何使属性不被前者覆盖:

MSBuild lets you set properties on the command line by using the /property (or /p) switch. These global property values override property values that are set in the project file. This includes environment properties, but does not include reserved properties, which cannot be changed.

Global properties can also be set or modified for child projects in a multi-project build by using the Properties attribute of the MSBuild task

If you specify a property by using the TreatAsLocalProperty attribute in a project tag, that global property value doesn't override the property value that's set in the project file.

它还链接到 Project元素文档基本上重复相同的信息,并表示属性中的多个属性应该用分号分隔。

简而言之,代码适用于您的案例:

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
TreatAsLocalProperty="OutDir">

请注意,这将完全禁止从项目外部更改 OutDir。更可配置的替代解决方案可能是拥有一个小型 stub 项目,您可以使用 TFS 构建该项目而不是主项目。在该项目中,您可以决定是否将 OutDir 传递到实际项目或覆盖它,例如通过导入可能定义或未定义的文件或基于环境变量等来获取值。这给出了基本思想:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Try import if this file exists, it should supply the value for CustomOutDir-->
<Import Project="$(MSBuildThisFileDirectory)customoutdir.props" Condition="Exists('$(MSBuildThisFileDirectory)customoutdir.props')"/>
<PropertyGroup>
<!-- Default value for CustomOutDir if not set elsewhere -->
<CustomOutDir Condition="'$(CustomOutDir)' == ''">$(MSBuildThisFileDirectory)bin\$(Configuration)</CustomOutDir>
<!-- ApplyCustomOutDir specifies whether or not to apply CustomOutDir -->
<ActualOutDir Condition="'$(ApplyCustomOutDir)' == 'True'">$(CustomOutDir)</ActualOutDir>
<ActualOutDir Condition="'$(ApplyCustomOutDir)' != 'True'">$(OutDir)</ActualOutDir>
</PropertyGroup>
<Target Name="Build">
<MSBuild Projects="$(MasterProject)" Properties="OutDir=$(ActualOutDir)"/>
</Target>
</Project>

并且应该通过传递 neede 属性来调用,例如

msbuild stub.targets /p:MasterProject=/path/to/main.vcxproj;ApplyCustomOutDir=True

(我从未使用过TFS,因此传递属性的方式可能会有所不同)

关于msbuild - 如何忽略相应 csproj 文件中命令行上给出的属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33704842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com