Hanya ingin tahu apakah seseorang dapat membantu saya dengan beberapa skrip msbuild yang saya coba tulis. Yang ingin saya lakukan adalah menyalin semua file dan sub folder dari folder ke folder lain menggunakan msbuild.
{ProjectName}
|----->Source
|----->Tools
|----->Viewer
|-----{about 5 sub dirs}
Yang perlu saya lakukan adalah menyalin semua file dan sub folder dari folder alat ke folder debug untuk aplikasi tersebut. Ini adalah kode yang saya miliki sejauh ini.
<ItemGroup>
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
</Target>
Skrip build berjalan tetapi tidak menyalin file atau folder apa pun.
Terima kasih
scripting
msbuild
build-process
build
Nathan W.
sumber
sumber
%(RecursiveDir)
ke folder tujuan akan membuat ulang struktur direktori. Jika tidak, hasilnya akan datar. Ini adalah Jawaban Terbaik.%(RecursiveDir)
di MSBuild metadata item terkenal : docs.microsoft.com/en-us/visualstudio/msbuild/…Saya pikir masalahnya mungkin pada bagaimana Anda membuat ItemGroup Anda dan memanggil tugas Salin. Lihat apakah ini masuk akal:
<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>
sumber
CreateItem
tugas tidak lagi digunakan. regex memiliki alternatif. msdn.microsoft.com/en-us/library/s2y3e43x.aspxSaya agak baru mengenal MSBuild tetapi saya menemukan Tugas EXEC berguna untuk situasi seperti ini. Saya menemukan tantangan yang sama dalam proyek saya dan ini berhasil untuk saya dan jauh lebih sederhana. Seseorang tolong beri tahu saya jika ini bukan praktik yang baik.
<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite"> <Exec Command="xcopy.exe $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" /> </Target>
sumber
Copy
tugas alih-alih perintah adalah kompatibilitas. Saya telah membangun di Linux menggunakan Mono sebelumnya, dan jelasxcopy
tidak berfungsi di sana.<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>
\**\*.*
membantu mendapatkan file dari semua folder. RecursiveDir membantu untuk meletakkan semua file di folder masing-masing ...sumber
CreateItem
tugas tidak lagi digunakan. regex memiliki alternatif. msdn.microsoft.com/en-us/library/s2y3e43x.aspxApakah Anda mencoba menentukan direktori tujuan konkret, bukan
Saya tidak terlalu mahir dengan sintaks MSBuild tingkat lanjut, tapi
terlihat aneh bagiku. Skrip terlihat bagus, jadi masalahnya mungkin pada nilai
$(ApplicationDirectory)
dan$(OutputPath)
EDIT:
Berikut adalah posting blog yang mungkin berguna:
Cara: Menyalin File Secara Rekursif Menggunakan Tugas
sumber
Ini adalah contoh yang berhasil:
<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>
sumber: https://msdn.microsoft.com/en-us/library/3e54c37h.aspx
sumber
Ini adalah tugas salin yang saya gunakan dalam proyek saya sendiri, ini berfungsi dengan sempurna bagi saya yang berhasil menyalin folder dengan sub folder ke tujuan:
<ItemGroup > <MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" /> </ItemGroup> <Target Name="AfterCopy" AfterTargets="WebPublish"> <Copy SourceFiles="@(MyProjectSource)" OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>
Dalam kasus saya, saya menyalin folder publikasi proyek ke folder tujuan lain, saya pikir itu mirip dengan kasus Anda.
sumber
Secara pribadi saya telah menggunakan CopyFolder yang merupakan bagian dari Perpustakaan Tugas SDC.
http://sdctasks.codeplex.com/
sumber
Cara terbaik untuk menyalin file secara rekursif dari satu direktori ke direktori lain menggunakan MSBuild menggunakan tugas Salin dengan SourceFiles dan DestinationFiles sebagai parameter. Misalnya - Untuk menyalin semua file dari direktori build ke direktori cadangan
<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>
Sekarang di atas perintah Salin semua direktori sumber dilalui dan file disalin ke direktori tujuan.
sumber
Jika Anda bekerja dengan toolchain C ++ tipikal, cara lain untuk melakukannya adalah menambahkan file Anda ke dalam daftar CopyFileToFolders standar
<ItemGroup> <CopyFileToFolders Include="materials\**\*"> <DestinationFolders>$(MainOutputDirectory)\Resources\materials\%(RecursiveDir)</DestinationFolders> </CopyFileToFolders> </ItemGroup>
Selain sederhana, ini adalah cara yang bagus untuk melakukannya karena tugas CopyFilesToFolders akan menghasilkan input, output, dan bahkan file TLog yang sesuai oleh karena itu memastikan bahwa operasi penyalinan hanya akan berjalan ketika salah satu file input telah berubah atau salah satu file output hilang. Dengan TLog, Visual Studio juga akan mengenali proyek dengan benar sebagai "up to date" atau tidak (menggunakan mekanisme U2DCheck terpisah untuk itu).
sumber