【问题标题】:How can I know which properties are applicable for MSBuild?我如何知道哪些属性适用于 MSBuild?
【发布时间】:2014-08-19 15:03:41
【问题描述】:

通过here,我了解了如何使用 MSBuild 创建 Web 部署包。命令行如下所示:

MSBuild "MyProjectName.csproj" /T:Package /P:Configuration=Staging;PackageLocation="D:\Vishal\Package.zip"

ConfigurationPackageLocation 都是属性。

我只是想知道如何知道哪些属性适用?以及它们的正式定义?

我搜索了MSBuild Reserved and Well-Known Properties,但他们不在那里。 我搜索了MSBuild Task,仍然没有运气。

添加

似乎不同的项目类型有其特定的属性。例如,PackageLocation 属性应该特定于 Web 应用程序项目。我正在寻找的是这些属性的具体定义。

添加 2

我有一个如下的 MSBuild 任务。

> <MSBuild Targets="Clean; Package"
> Projects="$(XXXSolutionDirectory)\Web\Web.csproj"
> Properties="Configuration=$(Configuration); Platform=$(Platform);
> OutputPath=$(BinDirectory)\Web_Deployment_Package;
> PackageLocation=$(BinDirectory)\Web_Deployment_Package;
> PublishDir=$(BinDirectory); OutDir=$(BinDirectory);
> IntDir=$(IntDirectory); TfsBuild=$(TfsBuild);
> CscToolPath=$(CscToolPath); CscToolExe=$(CscToolExe);
> VbcToolPath=$(VbcToolPath); VbcToolExe=$(VbcToolExe);
> TargetProfile=$(XXXConfiguration)"></MSBuild>

PackageLocation 等属性放在 MSBuild 任务的 Properties 属性中。而不是在PropertyGroup 定义中。这是它出现在构建项目文件中的唯一位置。那么我在哪里可以找到它的定义来理解它的预期用途呢?

【问题讨论】:

  • 如果您将 /v:diag 开关传递给 MsBuild,它将为您提供极其详细的输出,包括目标属性
  • 谢谢。但这是过于冗长的信息。我没有看到 PacakgeLocation 属性的定义。
  • 你grep了完整的输出吗?无论如何:输出确实包含诸如“使用 中的目标 Package”之类的内容。在文本编辑器中打开 ,查找目标并查看它使用的属性。事情是 MsBuild 本身无法知道所有可能的属性,这不是它的工作原理。假设任务使用属性 $(Prop),Prop 不必存在。所以 MsBuild 无法列出它。唯一的参考是它出现在文本中的事实。因此,您必须转向简单的文本搜索。
  • btw for Targets 这是不同的,MsBuild 知道这些:stackoverflow.com/questions/2618201/… 例如,您也可以调整该答案以列出可用的 PropertyGroups,但同样,这并不是说 Package 任务使用的属性会出现。

标签: msbuild msbuild-task msbuild-4.0


【解决方案1】:

好的,让我们先从 MSBuild 的基本处理管道开始。 当 msbuild 引擎解析你的 proj 文件时 - 它需要所有

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.CSharp.targets

在第 379 行附近可以看到

<Import Project="Microsoft.Common.targets" />

这意味着 - 在最终的大脚本中 - 而不是第 379 行,您将看到 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets

然后在下一阶段 - msbuild 将计算所有全局属性和项目值。 它有一些关于将哪个值分配给属性的规则(因为您可能有多个具有不同值的属性声明,这些属性声明最终将成为具有单个值的属性 - 通常是最后一个或全局一个获胜)将分配给属性,但我将省略这些细节在这里。

您在 msbuild 命令行中指定的属性也参与了此过程。 特定的属性声明可以在多个 .targets 文件中,但这并不重要。重要的是 - 在全局属性处理阶段结束时,该属性将具有什么价值。 但是,如果您真的想知道特定属性在哪里定义 - 您需要手动搜索所有导入的 .targets 文件并找到属性声明标记。 目标文件可以在您的 .NET Fw 文件夹或已安装的 SDK 中(如果您有特定的项目类型,例如 Azure .ccproj 的)

例如 - 让我们以最流行的属性“配置”为例。 我在所有 .targets 文件中寻找文本 &lt;Configuration 和 Microsoft.Common.targets 第 132 行有这个条目:

<Configuration Condition=" '$(Configuration)'=='' ">Debug</Configuration>

如您所见 - 有一个条件是 - 如果尚未定义,请将配置设置为调试。 因为您将此属性的值指定为命令行参数 - 您的属性将具有更高的优先级并导致此条件为假,因此您的值将是此特定属性的最终值。 PublishDir 相同 - Microsoft.Common.targets 第 425 行:

  <!-- Output location for publish target. -->
  <PropertyGroup>
    <PublishDir Condition="'$(PublishDir)' != '' and !HasTrailingSlash('$(PublishDir)')">$(PublishDir)\</PublishDir>
    <PublishDir Condition="'$(PublishDir)'==''">$(OutputPath)app.publish\</PublishDir>
  </PropertyGroup>

等等。

一些属性(尤其是自定义项目类型)可以在它自己的 SDK .targets 文件中定义,但如果您打开该自定义 .zzProj 文件并可能在那里找到项目属性,或者您可以手动遵循所有 &lt;import 指令- 最终将找到每个特定属性的定义位置。通常与定义一起 - 您可以跟踪目标如何使用此属性(搜索 $(MyPropertyName) )和任务,因此 - 根据您自己的需要更改它或发现错误或奇怪的用法。

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    首先对 MsBuild 脚本进行预处理,以将所有导入的脚本展平并合并到一个 MsBuild 文件中。

    MsBuild.exe MyProject.proj /pp >Output.xml
    

    现在,在记事本中打开 Output.xml 并搜索 $(Configuration) 和 $(PackageLocation) 的实例。

    $(Configuration) 是您可以在大多数 MsBuild 项目中找到的基本默认属性之一,您会看到它在 Microsoft.Common.CurrentVersion.Targets 中使用,这些目标旨在在无效或使用了意外的平台或配置属性。

    PackageLocation 特定于 ASP.NET 项目,导入分类将包括 Microsoft.Web.Publishing.targets,其中包含多个目标,专门用于解析和验证该属性,作为 Web 发布工作流的一部分。

    【讨论】:

    • 谢谢。 /pp 预处理很有帮助。但是我在 *.proj 文件中有类似的东西。 (见我的添加 2)。属性(例如 PackageLocation)作为 MSBuild 任务的属性值包含在内。如何找到它们的定义?
    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 2021-09-22
    • 2014-02-14
    • 2014-08-05
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多