Mencegah perakitan referensi PDB dan file XML disalin ke output

118

Saya memiliki proyek Visual Studio 2008 C # / .NET 3.5 dengan tugas membangun posting untuk ZIP isinya. Namun saya menemukan bahwa saya juga mendapatkan file rakitan yang direferensikan .pdb (debug) dan .xml (dokumentasi) di direktori output saya (dan ZIP).

Misalnya, jika MyProject.csproj mereferensikan YourAssembly.dll dan ada file YourAssembly.xml dan YourAssembly.pdb di direktori yang sama dengan DLL, mereka akan muncul di direktori keluaran saya (dan ZIP).

Saya dapat mengecualikan * .pdb saat membuat ZIP tetapi saya tidak dapat mengecualikan file * .xml karena saya memiliki file penerapan dengan ekstensi yang sama.

Apakah ada cara untuk mencegah proyek menyalin file PDB dan XML perakitan yang direferensikan?

Jason Morse
sumber

Jawaban:

68

Anda juga dapat menentukan ini melalui baris perintah:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
mwjackson
sumber
9
Ini sepertinya cara yang harus dilakukan karena Anda bisa memasukkannya dalam argumen MSBuild definisi build Anda dan tidak perlu meretas file csproj.
The Muffin Man
2
Ini berfungsi dengan baik dari TFS dan menghemat keharusan memodifikasi 100 proyek dalam kasus saya
ste-fu
Juga berfungsi baik dengan build gaya TFS2018 dan non-XAML.
Knipp
solusi rapi & cepat. Terima kasih
Karan
158

Saya ingin dapat menambah dan menghapus rakitan yang direferensikan dalam aplikasi utama saya sambil menghindari kebutuhan untuk mempertahankan file mana yang perlu saya hapus atau kecualikan.

Saya terus Microsoft.Common.targetsmencari sesuatu yang akan berhasil dan menemukan AllowedReferenceRelatedFileExtensionsproperti itu. Ini default .pdb; .xmljadi saya secara eksplisit mendefinisikannya dalam file proyek saya. Tangkapannya adalah Anda memerlukan sesuatu (spasi tidak mencukupi) jika tidak maka masih akan menggunakan default.

<Project ...>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <AllowedReferenceRelatedFileExtensions>
      <!-- Prevent default XML and PDB files copied to output in RELEASE. 
           Only *.allowedextension files will be included, which doesn't exist in my case.
       -->
      .allowedextension
    </AllowedReferenceRelatedFileExtensions> 
  </PropertyGroup>
Jason Morse
sumber
3
Ini mungkin cara yang "benar" tapi sangat tersembunyi yang buruk dalam buku saya.
Mladen Mihajlovic
1
Ini bekerja saat membangun dari Visual Studio IDE. Namun, itu tidak berhasil untuk saya saat membangun melalui MSBuild. Saya tidak perlu menentukannya sebagai opsi a / p jika ada di file proyek.
redcurry
19

Anda dapat menambahkan perintah peristiwa Post Build yang mirip dengan del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

AndrewJacksonZA
sumber
Terima kasih. Ini berfungsi jika Anda memiliki daftar statis dari rakitan yang direferensikan. Namun dalam kasus kami, kami memiliki lebih dari dua lusin, dengan banyak di antaranya berubah-ubah saat kami melakukan refaktorisasi.
Jason Morse
4
Secara pribadi saya pikir ini adalah jawaban yang benar - dengan cara lain Anda meretas file proyek dan siapa pun (atau Anda sendiri bertahun-tahun kemudian) tidak akan tahu ke mana harus mencari untuk melihat ini dicegah.
Mladen Mihajlovic
1
Saya lebih suka cara ini juga. Saya suka membiarkan apa pun yang perlu terjadi (atau dirancang untuk terjadi di tempat pertama) selesai dan kemudian membiarkan acara pasca membangun membuatnya seperti yang saya inginkan pada akhirnya. Sepertinya jauh lebih bersih seperti ini!
Arvo Bowen
Meskipun solusi ini berfungsi, itu tidak benar-benar dioptimalkan karena Anda kehilangan waktu menyalin sesuatu yang akan Anda hapus. Saya juga selalu menganggap langkah-langkah pembuatan pra / pasca sebagai peretasan karena mereka tidak bekerja dengan baik dalam sistem pembangunan daripada target atau file proj.
Kristus.
Wow @ christ.s, * chuckle * Saya berharap dalam sepuluh tahun sejak saya menjawab pertanyaan ini tim Visual Studio akan membuat ini lebih mudah. :-)
AndrewJacksonZA
5

Ini adalah pertanyaan yang agak lama, tetapi karena tidak ada jawaban tentang cara mematikan pembuatan file PDB dan XML melalui UI, saya pikir itu harus ada di sini untuk kelengkapan.

Dalam Visual Studio 2013: di properti proyek, di bawah tab kompilasi, hapus centang "Hasilkan file dokumentasi XML", lalu klik "Opsi Kompilasi Lanjutan" di bawahnya dan ubah "Hasilkan info debug" menjadi "Tidak ada", dan itu akan berhasil.

Dingo
sumber
15
Itu tidak akan memengaruhi paket nuget apa pun yang Anda sertakan, yang masih akan mereka miliki pdbdan xmlfile.
Lankymart
Saya menggunakan properti OctoPack di file csproj saya dan ini melakukan trik untuk file PDB dan XML saya. Saya juga menggunakan VS 2015. Build -> Advanced di bawah Output -> atur Debug Info ke none di bawah Output
Devin Prejean
0

Jawaban saya mungkin sepele sekarang tetapi saya ingin membagikan skrip BAT yang saya gunakan untuk menghapus file xml jika ada dll yang sesuai untuknya. Ini berguna jika Anda hanya ingin membersihkan folder output dan memiliki file xml lain yang tidak ingin dihapus.

SETLOCAL EnableDelayedExpansion

SET targetDir=%1

ECHO Deleting unnecessary XML files for dlls

FOR %%F IN (%targetDir%*.xml) DO (

  SET xmlPath=%%~fF
  SET dllPath=!xmlPath:.xml=.dll!

  IF EXIST "!dllPath!" (
    ECHO Deleting "!xmlPath!"
    DEL "!xmlPath!"
  )
)

Pemakaian:

Cleanup.bat c:\my-output-folder\

Saya membutuhkan waktu satu jam untuk menyelesaikan pekerjaan sederhana ini (berkat hal-hal "perluasan tertunda") dengan semua jenis pencarian di sana-sini. Semoga bisa membantu pemula BAT lainnya seperti saya.

Jeffrey Zhao
sumber
0

Saya tidak terlalu beruntung dengan jawaban yang lain, akhirnya saya menemukan cara melakukan ini dalam implementasi saya dengan menggunakan perintah "Hapus" bawaan , tampaknya ada cara khusus yang Anda perlukan untuk mengimplementasikan wildcard , ini sedikit bernuansa , inilah semua yang Anda butuhkan untuk dimasukkan ke dalam "CSPROJ" ( TargetDir adalah variabel bawaan , disertakan secara otomatis) di bawah tag "Proyek":

<Target Name="RemoveFilesAfterBuild">   
    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>

Saya juga mengalami masalah dengan berbagai folder khusus bahasa yang sedang dibuat, jika Anda memiliki masalah itu juga, Anda juga dapat menghapus folder khusus bahasa yang tidak digunakan. Saya telah memilih untuk hanya memicu ini di bawah jenis build "Rilis":

<ItemGroup>
    <FluentValidationExcludedCultures Include="be;cs;cs-CZ;da;de;es;fa;fi;fr;ja;it;ko;mk;nl;pl;pt;ru;sv;tr;uk;zh-CN;zh-CHS;zh-CHT">
        <InProject>false</InProject>
    </FluentValidationExcludedCultures> 
</ItemGroup>

<Target Name="RemoveTranslationsAfterBuild" AfterTargets="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <RemoveDir Directories="@(FluentValidationExcludedCultures->'$(OutputPath)%(Filename)')" />

    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>
David Rogers
sumber
-3

Jika Anda hanya ingin mengecualikan file XML (katakanlah rilis debug) Anda bisa melakukan sesuatu seperti ini:

<AllowedReferenceRelatedFileExtensions>
  <!-- Prevent default XML from debug release  -->
      *.xml
 </AllowedReferenceRelatedFileExtensions>

Pada dasarnya, setiap ekstensi (dipisahkan oleh titik koma) yang terdaftar akan dikecualikan.

ProVega
sumber
1
Pertanyaan ini dan jawaban yang diterima berumur 4 tahun, dan jawaban Anda hampir seperti salinan-tempel dari jawaban yang diterima.
Zack
1
Yang berbeda adalah sintaks hanya untuk file XML yang saya butuhkan. Saya harus melakukan penelitian untuk sintaks yang tepat dari tag ini. Saya menemukan jawaban asli membantu dan memilihnya, tetapi saya pikir saya dapat menghemat waktu orang lain jika mereka hanya perlu memfilter jenis file tertentu.
ProVega
11
Tapi bukankah ini termasuk file xml, bukan mengecualikannya?
David Gardiner