0

バッチ処理を使用して1つ以上のcsprojプロジェクトが新しくビルドされたため、新しいnugetパッケージが必要であることを確認するmsbuildプロジェクトを実行したいと思います。これまでに作成したスクリプトは妥当なスタートのように見えますが、インクリメンタルビルドメカニズムが機能していません。MainBuildターゲットは、何があっても毎回実行されます。

これが私が持っているものです:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="MainBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)'=='' ">Debug</Configuration>
    <Content>content\plugins\</Content>
  </PropertyGroup>
  <ItemGroup>
    <Nuspec Include="$(MSBuildProjectDirectory)\plugins\*\*.nuspec" />
  </ItemGroup>

<Target Name="MainBuild"
        Inputs="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll"
        Outputs="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" >
  <ItemGroup>
    <Inputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll" />
    <Outputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" />
  </ItemGroup>
  <Message Text="INPUTS: %(Inputs.FullPath)" />
  <Message Text="OUTPUTS: @(Outputs->'%(FullPath)')" />

  <Copy SourceFiles="@(Inputs)" DestinationFiles="@(Outputs->'%(FullPath)')" />

</Target>
</Project>

このCopyタスクは、nugetを呼び出して新しいパッケージを作成するためのデバッグプレースホルダーにすぎません。

bin\Debugディレクトリ内のファイルが対応する.nuspecファイル(上記の2つのフォルダーにあるbin\Debug)よりも新しい場合、MainBuildターゲットを実行する必要があるという考え方です。

何か案は?

psおそらくそれぞれの属性InputsOutputs属性がアイテムを作成します。Target作成したアイテムがターゲット内で参照できないのは不思議だと思います。上記の例では、アイテムにアクセスできるように、アイテムを再作成するためにtarget-interna動的ItemGroupを作成する必要がありました。それを回避する方法はありますか?

4

1 に答える 1

0

これはMSBuildバッチ処理のドキュメントで読みました

ターゲット内のタスクがバッチ処理を使用する場合、MSBuildは、アイテムの各バッチの入力と出力が最新であるかどうかを判断する必要があります。それ以外の場合、ターゲットはヒットするたびに実行されます。

これは赤銅鉱かもしれません。コピーターゲットを変更して、ite変換の代わりにバッチ処理を使用してみてください(アイテムグループでアイテムメタデータを使用しても、上記の要件を満たすとは思いません)。

<Target Name="MainBuild"
        Inputs="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll"
        Outputs="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" >
    <ItemGroup>
        <Inputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll" />
        <Outputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" />
    </ItemGroup>
    <Message Text="INPUTS: %(Inputs.FullPath)" />
    <Message Text="OUTPUTS: @(Outputs->'%(FullPath)')" />

    <Copy SourceFiles="@(Inputs)" DestinationFiles="%(Outputs.FullPath)" />

</Target>

入力の数が出力の数と異なる可能性があるようです(各プロジェクトの出力ディレクトリに複数の.dllファイルがあると思われます)。これにより、ターゲットも実行されます。

于 2013-01-04T14:33:12.150 に答える