我不明白目标是如何相互依赖的,最重要的是,变量如何通过目标图表。
我有一个具体的例子:CSC目标具有AddModules
属性/属性。我想使用我的.csproj
文件进行设置。正如您将在下面看到的,我尝试了许多不同的解决方案,但我不明白为什么其中一个有效,而有些则无法解决。我在代码中写了一些问题:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<TargetFrameworkProfile>Profile88</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<!--1) Why don't I get fatal error here even though <AddModules> is invalid inside the <PropertyGroup>?"-->
<!--2) Why doesn't this work (doesn't pass the AddModules to the CSC target unlike other properties like FileAlignment)?"-->
<AddModules>$(OutputPath)Ark.Weak.netmodule</AddModules>
<!--3) Why do I get the following fatal error here: "error : The attribute "Include" in element <AddModules> is unrecognized."?-->
<AddModules Include="$(OutputPath)Ark.Weak.netmodule" />
</PropertyGroup>
<ItemGroup>
<!--4) Why do I get the following fatal error here? "error : The reference to the built-in metadata "Extension" at position 1 is not allowed in this condition "'%(Extension)'=='netmodule'"."-->
<AddModules Include="@(ReferencePath)" Condition="'%(Extension)'=='netmodule'" />
<!--5) Why do I get the following fatal error here: "error : The attribute "Remove" in element <ReferencePath> is unrecognized."?-->
<ReferencePath Remove="@(AddModules)" />
<!--6) Why does this work even though <AddModules> is invalid inside the <ItemGroup>?"-->
<!--7) Why does this do the job (passes the AddModules to the CSC target)?"-->
<AddModules Include="$(OutputPath)Ark.Weak.netmodule" />
</ItemGroup>
</Project>
答案 0 :(得分:2)
这是一个相当复杂的问题(关于目标依赖和变量旅行),如果我们深入研究细节,答案可以是关于msbuild的完整文章或演示文稿。
我会尝试回答您的代码示例问题并尝试尽可能简短。随意询问有关详细信息。
在PropertyGroup中AddModules无效 - 您刚刚创建了一个名为AddModules的新属性。
根据我发现 - csc任务查找名为AddModule的项目,而不是属性1。简单来说 - Msbuild Items是一种数组,属性是字符串。 @(AddModule)语法意味着它期望条目数组(将使用@()构造连接到逗号分隔的字符串)
属性没有包含属性,只允许条件。Check this reference
在这种情况下,ReferencePath是一个属性(我认为),它根本不包含元数据。 在调用ResolveAssemblyReference目标之后,将有一个具有该名称的项目。在这种情况下,我认为它尚未召唤。
删除仅适用于“文件”类型成员的属性,而不适用于任意字符串类型成员。但我仍然怀疑这个错误是因为你当时还没有@(ReferencePath)项目。Check this reference关于删除属性的更多细节。
这不是无效的。它只是变量的名称。所以它在那里完全合法。
因为csc期望item为参数,所以此语句创建它并作为全局变量发出。将在同一上下文中触发的每个目标都可以使用@(AddModule)语法访问此项目
答案 1 :(得分:1)