0

我不明白目标如何相互依赖,最重要的是,变量如何通过目标图。我有一个具体的例子: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>
4

2 回答 2

2

这是一个相当复杂的问题(关于目标依赖和变量移动),如果我们深入研究细节,答案可以是关于 msbuild 的完整文章或演示文稿。

我将尝试回答您的代码示例问题并尽可能简短。随时询问有关详细信息的更多信息。

  1. AddModules 在 PropertyGroup 中不是无效的 - 您刚刚创建了一个名为 AddModules 的新属性。

  2. 根据我的发现 - csc 任务正在寻找名称为 AddModule 的项目,而不是属性一。简单来说 - Msbuild Items 是一种数组,属性是字符串。@(AddModule) 语法意味着它期待条目数组(将使用 @() 构造连接到逗号分隔的字符串)

  3. 属性没有包含属性,只允许条件。检查此参考

  4. ReferencePath 在这种情况下是一个属性(我认为),它根本不包含元数据。在调用 ResolveAssemblyReference 目标后将有一个具有该名称的项目。在这种情况下,我认为它还没有调用。

  5. 删除属性仅适用于“文件”类型成员,不适用于任意字符串类型成员。但我仍然怀疑这个错误是因为你当时还没有 @(ReferencePath) 项目。检查此参考,了解更多关于 Remove 属性的详细信息。

  6. 它不是无效的。这只是变量的名称。所以那里是完全合法的。

  7. 因为 csc 期望 item 作为参数,并且此语句创建它并作为全局变量发出。将在同一上下文中触发的每个目标都可以使用 @(AddModule) 语法访问该项目

于 2013-01-08T04:13:44.187 回答
1

看看 MSDN 上的这篇文章“调试 msbuild 脚本”:http: //blogs.msdn.com/b/visualstudio/archive/2010/07/06/debugging-msbuild-script-with-visual-studio.aspx

于 2013-01-05T04:43:58.010 回答