1

次のコードで、MsBuildがサフィックスメタデータの設定を拒否するのはなぜだろうか。ItemGroup宣言の代わりにCreateItemタスクで動作します(CreateItemはビルド時に計算されるため)が、このコードは「プロパティファイル」にあるため、ここでは実行できません。プロジェクトにはターゲットがなく、単なる束です。私が実際のプロジェクトに含めるプロパティ/アイテムの数。

<ItemGroup>
        <Layout Include="Bla">
            <PartnerCode>bla</PartnerCode>
        </Layout>
        <Layout Include="Bli">
            <PartnerCode>bli</PartnerCode>
        </Layout>
</ItemGroup>

<ItemGroup Condition="'$(LayoutENV)'=='Preprod'">
        <LayoutFolder Include="Preprod">
            <Destination>..\Compil\layout\pre\</Destination>
        </LayoutFolder>
</ItemGroup>


<ItemGroup>
    <Destinations Include="@(LayoutFolder)" >
        <Suffix>%(Layout.PartnerCode)</Suffix>
    </Destinations>
</ItemGroup>

宛先は適切に構築されていますが、サフィックスメタデータが設定されていません。

今のところ、必要なすべてのプロジェクトで宛先定義を複製しましたが、あまりきれいではありません。誰かがより良い解決策を持っているなら、私は興味があります!

4

3 に答える 3

2

次のようにMSBuild 4、アイテム宣言で前のアイテムのメタデータを使用できます。

<ItemGroup>
  <Layout Include="Bla">
      <PartnerCode>bla</PartnerCode>
  </Layout>
  <Layout Include="Bli">
      <PartnerCode>bli</PartnerCode>
  </Layout>
</ItemGroup>

<ItemGroup>
  <Destinations Include="@(Layout)" >
      <Suffix>%(PartnerCode)</Suffix>
  </Destinations>
</ItemGroup>

LayoutFolder(バッチ処理してメタデータを取得しようとするのは奇妙ですLayout。Suffixblaまたはbliとしてどのような値が必要ですか?)

于 2010-09-02T17:02:41.647 に答える
0

メタデータをターゲットの外で動的に設定しようとしているようですが、これは不可能です。レイアウトアイテムをバッチ処理してサフィックスメタデータを設定しようとしましたが、バッチ処理が実行されたときにレイアウトアイテムが正しく設定されていません。バッチ処理は、msbuildがプロパティファイルを解析するときに実行され、レイアウトが宣言されるのを待ちません。

それでも、MadGnomeが指摘したように、MSBuildは宣言されるのを待つので、LayoutFolder(インクルードのソースアイテム)をバッチ処理できます。

于 2010-10-19T13:58:50.917 に答える
0

発生している問題は、リスト内のメタデータを参照していることです。「Layout」の%(Layout.PartnerCode)ItemGroupを反復処理します。この場合、2つのアイテムが返されます。1でも、リストを指しているため、望ましくない予期しない結果が発生します。MSBuildは2つのメタタグを返しますが、どちらを使用するかはわかりません。その結果、代わりにnoneを選択します...または..まあ、MSBuildはそれを何も設定しないことになります。

このように、デフォルトのItemDefinitionを設定することをお勧めします(MSBuild 3.5)

<ItemDefinitionGroup>
  <Layout>
    <PartnerCode>%(Identity)</PartnerCode>
    <Suffix>%(PartnerCode)</Suffix>
    <Destination Condition="'$(LayoutENV)'=='Preprod'">..\Compile\layout\pre\</Destination>
  </Layout>
</ItemDefinitionGroup>

そして、あなたが持っているようにそれらを定義します。

<ItemGroup>
    <Layout Include="Bla" />
    <Layout Include="Bli" />
    <Layout Include="Bloop">
        <PartnerCode>B2</PartnerCode>
        <Suffix>%(PartnerCode)</Suffix>
    </Layout>
</ItemGroup>

補足


。メタデータは、定義グループ/アイテムグループごとに1回だけ解析されるようです。したがって、PartnerCodeを設定している場合は、2番目の例に示すように、サフィックスもリセットする必要があります。私はMSBuild3.5の動作に精通していませんが、MSBuild4.0の場合はそうです。

。ファイル名をサフィックスとして使用することを前提としています。Identityトリックを実行します。ここで「MSBuildの既知のアイテムのメタデータ」を参照してください:(https://msdn.microsoft.com/en-us/library/ms164313.aspx)、そうでない場合は、いつでもカスタムオーバーライドの例に従うか、それに基づいて独自の関数を作成できます。このようなものの詳細については、「MSBuildプロパティ関数」を参照してください:(https://msdn.microsoft.com/en-us/library/dd633440.aspx

于 2017-05-09T19:00:33.523 に答える