8

.\Release現在、コードをフォルダーにコンパイルする Web 配置プロジェクトをセットアップしました。ビルド後、ファイルを別のマシンにコピーしたいと思います(ビルド先のディレクトリが削除されてから再作成されるため)。

コピーするファイルを定義するための ItemGroup は、次のように設定されます。

<ItemGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
    <ReleaseFiles Include=".\Release\**\*" />
    <OverrideFiles Include="..\website\App_Code\override\site.com\**\*" />
</ItemGroup>

「website」は複数のサイトで使用されるコードであるため、ソリューション内にいくつかの Web 展開プロジェクトが設定されています。

次に、ファイルをコピーするための AfterBuild ターゲットがあります。

<Target Name="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <Copy SourceFiles="@(ReleaseFiles)" ContinueOnError="true" SkipUnchangedFiles="true" DestinationFiles="@(ReleaseFiles->'\\server\web\site.com\%(RecursiveDir)%(Filename)%(Extension)')" />
    <Copy SourceFiles="@(OverrideFiles)" DestinationFiles="@(OverrideFiles->'\\server\web\site.com\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>

ただし、ReleaseFiles はコピーされません。その原因は何ですか? 毎回異なる可能性があるエラー.\TempBuildDir\folder\subfolder - The process cannot access the file because it is being used by another process.が発生しましfolder\subfolderたが、そのメッセージが表示されなくても、ファイルはまだコピーされていません。

問題は、以前は機能していたことです。

4

1 に答える 1

9

中心的な問題は、サンプルの ItemGroup が MSBuild ファイルの読み込み時に評価されていることです。その時点では、おそらく、それらのファイルはまだ存在していません...

したがって、「ReleaseFiles」および「OverrideFiles」コレクションは空であり、何もコピーされません。

あなたがする必要があるのは、ビルドが行われたに ItemGroups を動的に作成することです (そして、ここで参照されているファイルは実際に存在します):

<CreateItem Include=".\Release\**\*">
   <Output TaskParameter="Include" ItemName="ReleaseFiles"/>
</CreateItem>
<CreateItem Include="..\website\App_Code\override\site.com\**\*">
   <Output TaskParameter="Include" ItemName="OverrideFiles"/>
</CreateItem>

これで問題なく、コピー タスクが機能するはずです。

マルク

于 2009-10-08T11:49:10.483 に答える