从here开始,我将了解如何使用MSBuild创建Web部署包。命令行如下所示:
MSBuild" MyProjectName.csproj" / T:Package / P:Configuration = Staging; PackageLocation =" D:\ Vishal \ Package.zip"
Configuration
,PackageLocation
都是属性。
我只是想知道我怎么知道哪些属性适用?他们的正式定义?
我搜索了MSBuild Reserved and Well-Known Properties,但他们不在那里。 我搜索MSBuild Task,仍然没有运气。
似乎不同的项目类型具有其特定属性。例如,PackageLocation
属性应特定于Web应用程序项目。我正在寻找的是这些属性的具体定义。
我有一个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文件中出现的唯一地方。那么我在哪里可以找到它的定义来理解它的用途呢?
答案 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发布工作流程一部分的目标。