如何知道哪些属性适用于MSBuild?

如何知道哪些属性适用于MSBuild?,msbuild,msbuild-task,msbuild-4.0,Msbuild,Msbuild Task,Msbuild 4.0,从中,我了解了如何使用MSBuild创建Web部署包。命令行如下所示: MSBuild“MyProjectName.csproj”/T:Package/p:Configuration=Staging;PackageLocation=“D:\Vishal\Package.zip” 配置,包装位置都是属性 我只是想知道我如何知道哪些属性是适用的?它们的正式定义是什么 我搜了一遍,但它们不在那里。 我搜索了一下,还是没找到 添加 不同的项目类型似乎有其特定的属性。例如,PackageLocation属

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

MSBuild“MyProjectName.csproj”/T:Package/p:Configuration=Staging;PackageLocation=“D:\Vishal\Package.zip”

配置
包装位置
都是属性

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

我搜了一遍,但它们不在那里。 我搜索了一下,还是没找到

添加 不同的项目类型似乎有其特定的属性。例如,
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>
>Projects=“$(XXXSolutionDirectory)\Web\Web.csproj”
>Properties=“配置=$(配置);平台=$(平台);
>OutputPath=$(BinDirectory)\Web\u部署\u包;
>PackageLocation=$(BinDirectory)\Web\u部署\u包;
>PublishDir=$(BinDirectory);OutDir=$(BinDirectory);
>IntDir=$(IntDirectory);TfsBuild=$(TfsBuild);
>CscToolPath=$(CscToolPath);CscToolExe=$(CscToolExe);
>VbcToolPath=$(VbcToolPath);VbcToolExe=$(VbcToolExe);
>TargetProfile=$(XXXConfiguration)“>

诸如
PackageLocation
之类的属性放置在MSBuild任务的
properties
属性中。而不是在
属性组中定义。这是它在构建项目文件中显示的唯一位置。那么,在哪里可以找到它的定义来理解它的预期用途呢?

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

MsBuild.exe MyProject.proj /pp >Output.xml
现在,在记事本中打开Output.xml并搜索$(配置)和$(PackageLocation)的实例

$(配置)是在大多数MsBuild项目中可以找到的基本默认属性之一,在Microsoft.Common.CurrentVersion.Targets中可以看到,如果使用了无效或意外的平台或配置属性,则目标中的目标会使生成失败


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

好的,让我们先从MSBuild的基本处理管道开始。 当msbuild引擎解析您的项目文件时,它需要
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.CSharp.targets
在379线附近你可以看到

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

这意味着,在最后一个大脚本中,您将看到 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets

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

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

例如,让我们以最流行的属性“配置”为例。
我在所有.targets文件中搜索文本
,如果将
/v:diag
开关传递到MsBuild,它将提供极其详细的输出,包括targetsHanks的属性。但这太冗长了。我没有看到
PacakgeLocation
属性的定义。您是否对完整的输出进行了grep?无论如何:输出确实包含类似“使用目标
from”的内容。在文本编辑器中打开,查找目标并查看它使用的属性。问题是MsBuild本身无法知道所有可能的属性,这不是它的工作方式。假设任务使用属性$(Prop),则Prop不必存在。因此MsBuild无法列出它。唯一的参考是它出现在文本中的事实。因此,您必须使用simple text search.btw搜索目标。这是不同的,MsBuild知道这些:例如,您也可以调整该答案,以列出可用的属性组,但同样,并没有说包任务使用的属性会出现。谢谢。
/pp
预处理很有帮助。但我在*.proj文件中有类似的内容。(见我的补充2)。属性(如
PackageLocation
)作为MSBuild任务的属性值包括在内。如何找到它们的定义?
<Configuration Condition=" '$(Configuration)'=='' ">Debug</Configuration>
  <!-- Output location for publish target. -->
  <PropertyGroup>
    <PublishDir Condition="'$(PublishDir)' != '' and !HasTrailingSlash('$(PublishDir)')">$(PublishDir)\</PublishDir>
    <PublishDir Condition="'$(PublishDir)'==''">$(OutputPath)app.publish\</PublishDir>
  </PropertyGroup>