我怎么知道哪些属性适用于MSBuild?

时间:2014-08-19 15:03:41

标签: msbuild msbuild-task msbuild-4.0

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,仍然没有运气。

ADD

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

ADD 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定义。这是它在构建proj文件中出现的唯一地方。那么我在哪里可以找到它的定义来理解它的用途呢?

2 个答案:

答案 0 :(得分:2)

好的,让我们首先介绍一下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文件中查找文本<Configuration和Microsoft.Common.targets第132行有此条目:

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

正如您所看到的 - 有一个条件就是说 - 如果尚未定义,则将配置设置为Debug。 因为您将此属性的值指定为命令行参数 - 您的属性将具有更高的优先级并将导致此条件为false,因此您的值将是此特定属性的最终值。 与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文件并可能在那里找到项目属性,或者您可以手动关注所有{{1} }指令 - 最终将找到定义每个特定属性的位置。通常与定义一起 - 您可以跟踪目标如何使用此属性(搜索 $(MyPropertyName))和任务,从而 - 根据您自己的需要更改它或发现错误或奇怪的用法。

希望这会对你有所帮助。

答案 1 :(得分:1)

首先预处理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发布工作流程一部分的目标。