誰かが私が作成しようとしているmsbuildスクリプトを手伝ってくれるかどうか疑問に思っています。 msbuildを使用して、すべてのファイルとサブフォルダーをフォルダーから別のフォルダーにコピーします。
{ProjectName}
|----->Source
|----->Tools
|----->Viewer
|-----{about 5 sub dirs}
できるようにする必要があるのは、すべてのファイルとサブフォルダーをツールフォルダーからアプリケーションのデバッグフォルダーにコピーすることです。これは私がこれまでに持っているコードです。
<ItemGroup>
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
</Target>
ビルドスクリプトは実行されますが、ファイルやフォルダーはコピーされません。
ありがとう
私もこれに関するヘルプを探していました。時間がかかりましたが、ここで私がやったことはとてもうまくいきました。
_<Target Name="AfterBuild">
<ItemGroup>
<ANTLR Include="..\Data\antlrcs\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>
_
これにより、antlrcs
という名前のフォルダーの内容が$(TargetDir)
に再帰的にコピーされました。
問題は、ItemGroupの作成方法とCopyタスクの呼び出し方法にあると思われます。これが理にかなっているかどうかを確認します。
<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
<YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
</PropertyGroup>
<Target Name="BeforeBuild">
<CreateItem Include="$(YourSourceDirectory)\**\*.*">
<Output TaskParameter="Include" ItemName="YourFilesToCopy" />
</CreateItem>
<Copy SourceFiles="@(YourFilesToCopy)"
DestinationFiles="@(YourFilesToCopy->'$(YourDestinationDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
</Project>
私はMSBuildを初めて使用しますが、このような状況にはEXECタスクが便利です。私はプロジェクトで同じ課題に遭遇しましたが、これは私にとってはうまくいき、はるかに簡単になりました。それが良い習慣ではない場合、誰か教えてください。
<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite">
<Exec Command="xcopy.exe $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" />
</Target>
<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
<YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
</PropertyGroup>
<Target Name="BeforeBuild">
<CreateItem Include="$(YourSourceDirectory)\**\*.*">
<Output TaskParameter="Include" ItemName="YourFilesToCopy" />
</CreateItem>
<Copy SourceFiles="@(YourFilesToCopy)"
DestinationFiles="$(YourFilesToCopy)\%(RecursiveDir)" />
</Target>
</Project>
\**\*.*
すべてのフォルダーからファイルを取得するのに役立ちます。 RecursiveDirは、すべてのファイルをそれぞれのフォルダーに配置するのに役立ちます...
代わりに具体的な宛先ディレクトリを指定しようとしましたか
_DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ?
_
私は高度なMSBuild構文にあまり精通していませんが、
_@(Viewer->'$(OutputPath)\\Tools')
_
私には奇妙に見えます。スクリプトはよさそうなので、問題は$(ApplicationDirectory)
および$(OutputPath)
の値にある可能性があります
編集:
これは役に立つかもしれないブログ投稿です:
これは働いた例です:
<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<ItemGroup>
<MySourceFiles Include="c:\MySourceTree\**\*.*"/>
</ItemGroup>
<Target Name="CopyFiles">
<Copy
SourceFiles="@(MySourceFiles)"
DestinationFiles="@(MySourceFiles->'c:\MyDestinationTree\%(RecursiveDir)%(Filename)%(Extension)')"
/>
</Target>
</Project>
これは自分のプロジェクトで使用したコピータスクです。サブフォルダーを含むフォルダーをコピー先に正常にコピーすることができました。
<ItemGroup >
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" />
</ItemGroup>
<Target Name="AfterCopy" AfterTargets="WebPublish">
<Copy SourceFiles="@(MyProjectSource)"
OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>
私の場合、プロジェクトの発行フォルダーを別の宛先フォルダーにコピーしました。これはあなたの場合と似ていると思います。
個人的には、SDCタスクライブラリの一部であるCopyFolderを使用しました。
MSBuildを使用して、あるディレクトリから別のディレクトリにファイルを再帰的にコピーする最良の方法は、パラメーターとしてSourceFilesとDestinationFilesを使用してコピータスクを使用することです。たとえば、すべてのファイルをビルドディレクトリからバックアップディレクトリにコピーするには
<PropertyGroup>
<BuildDirectory Condition="'$(BuildDirectory)' == ''">Build</BuildDirectory>
<BackupDirectory Condition="'$(BackupDiretory)' == ''">Backup</BackupDirectory>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(MSBuildProjectDirectory)/$(BuildDirectory)/**/*.*" />
</ItemGroup>
<Target Name="Backup">
<Exec Command="if not exist $(BackupDirectory) md $(BackupDirectory)" />
<Copy SourceFiles="@(AllFiles)" DestinationFiles="@(AllFiles->
'$(MSBuildProjectDirectory)/$(BackupDirectory)/%(RecursiveDir)/%(Filename)%
(Extension)')" />
</Target>
これで、上記の[コピー]コマンドでは、すべてのソースディレクトリが走査され、ファイルが宛先ディレクトリにコピーされます。