0

ターゲットが互いにどのように依存しているか、そして最も重要なこととして、変数がターゲット グラフをどのように移動するかがわかりません。具体例があります。CSC ターゲットにはAddModules属性/プロパティがあります。.csprojファイルを使用して設定したい。以下に示すように、さまざまな解決策を試しましたが、そのうちの 1 つが機能し、他のソリューションが機能しない理由がわかりません。コード内にいくつかの質問を書きました。

<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. 私が見つけたものによると、プロパティ1ではなく、AddModuleという名前のアイテムを探しているcscタスク。簡単に言うと、Msbuild Items は一種の配列で、プロパティは文字列です。@(AddModule) 構文は、エントリの配列を期待していることを意味します (これは @() 構造でカンマ区切りの文字列に結合されます)

  3. プロパティには Include 属性がなく、条件のみが許可されます。この参照を確認してください

  4. ReferencePath はその場合のプロパティであり (私が思うに)、メタデータはまったく含まれていません。ResolveAssemblyReference ターゲットが呼び出された後、その名前のアイテムが存在します。この場合、まだ呼び出されていないと思います。

  5. 任意の文字列型のメンバーではなく、「ファイル」型のメンバーにのみ適用される属性を削除します。しかし、その時点で @(ReferencePath) アイテムがまだないため、このエラーが発生したと思われます。Remove 属性の詳細については、このリファレンスを確認してください。

  6. 無効ではありません。変数名だけです。したがって、それは完全に合法です。

  7. csc は項目をパラメーターとして想定しているため、このステートメントはそれを作成し、グローバル変数として出力します。同じコンテキストでトリガーされるすべてのターゲットは、@(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 に答える