Referanslı montaj PDB ve XML dosyalarının çıktıya kopyalanmasını önleme


118

İçeriği ZIP haline getirmek için bir post build görevi olan bir Visual Studio 2008 C # /. NET 3.5 projem var. Ancak, çıkış dizinimde (ve ZIP) başvurulan derlemelerin .pdb (hata ayıklama) ve .xml (belge) dosyalarını da aldığımı görüyorum.

Örneğin, MyProject.csproj, YourAssembly.dll'ye başvurursa ve DLL ile aynı dizinde YourAssembly.xml ve YourAssembly.pdb dosyaları varsa, bunlar çıktı dizinimde (ve ZIP) görünür.

ZIP oluştururken * .pdb'yi hariç tutabilirim ancak aynı uzantıya sahip dağıtım dosyalarım olduğu için * .xml dosyalarını dışlayamıyorum.

Projenin başvurulan montaj PDB ve XML dosyalarını kopyalamasını engellemenin bir yolu var mı?

Yanıtlar:


68

Bunu komut satırından da belirtebilirsiniz:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none

9
Bu, izlenecek yol gibi görünüyor, çünkü bunu yalnızca yapı tanımı MSBuild argümanlarınıza dahil edebilirsiniz ve csproj dosyalarını hacklemek zorunda kalmazsınız.
Kek Adam

2
Bu TFS'den harika çalışıyor ve benim durumumda
100'lerce

Ayrıca TFS2018 ve XAML olmayan stil yapılarla harika çalışır.
Knipp

temiz ve hızlı çözüm. Teşekkürler
Karan

158

Silmem veya dışlamam gereken dosyaları koruma ihtiyacını ortadan kaldırırken birincil uygulamamda başvurulan derlemeleri ekleyip kaldırabilmek istedim.

Ben karıştırdı Microsoft.Common.targetsçalışmak ve kuracağını şey arıyor AllowedReferenceRelatedFileExtensionsözelliği. Varsayılan olarak .pdb; .xml, proje dosyamda bunu açıkça tanımladım. İşin püf noktası, bir şeye ihtiyacınız olmasıdır (boşluk yeterli değildir), aksi takdirde yine de varsayılanı kullanacaktır.

<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>

3
Bu "doğru" yol olabilir ama o kadar gizli ki kitaplarımda kötü.
Mladen Mihajlovic

1
Bu, Visual Studio IDE'den derlenirken çalıştı. Ancak, MSBuild aracılığıyla derleme yaparken benim için işe yaramadı. Proje dosyasındaysa / p seçeneği olarak belirtmeme gerek yok.
redcurry

19

Şuna benzer bir Oluşturma Sonrası olay komutu ekleyebilirsiniz. del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


Teşekkürler. Bu, başvurulan derlemelerin statik bir listeniz varsa çalışır. Ancak bizim durumumuzda iki düzineden fazlası vardı ve bunların çoğu yeniden düzenlenirken akış halinde.
Jason Morse

4
Şahsen bunun doğru cevap olduğunu düşünüyorum - diğer yolla proje dosyasını kırarsınız ve başkaları (veya yıllar sonra kendiniz) bunun önlendiğini görmek için nereye bakacağını bilemez.
Mladen Mihajlovic

1
Ben de bu yolu tercih ederim. Olması gereken (veya ilk etapta olması için tasarlanmış olan) her şeyin bitmesine izin vermeyi ve ardından postanın olayları sonunda istediğim gibi yapmasına izin vermeyi seviyorum. Bu şekilde çok daha temiz görünüyor!
Arvo Bowen

Bu çözüm işe yarasa bile, sileceğiniz bir şeyi kopyalamak için zaman kaybettiğiniz için gerçekten optimize edilmemiştir. Ayrıca, bir yapı sisteminde hedefler veya proje dosyalarından daha iyi çalışmadıkları için, derleme öncesi / sonrası adımlarını her zaman hack olarak düşündüm.
mesih.

Vay be @ christ.s, * kıkırdama * Bu soruyu yanıtladığımdan beri geçen on yıl içinde Visual Studio ekibinin bunu kolaylaştıracağını umuyorum. :-)
AndrewJacksonZA

5

Bu oldukça eski bir soru, ancak UI aracılığıyla PDB ve XML dosyaları oluşturmanın nasıl kapatılacağına dair bir cevap olmadığından, tamlık için burada olması gerektiğini düşündüm.

Visual Studio 2013'te: proje özelliklerinde, derleme sekmesi altında, "XML dokümantasyon dosyası oluştur" seçeneğinin işaretini kaldırın, ardından bunun altındaki "Gelişmiş Derleme Seçenekleri" ni tıklayın ve "Hata ayıklama bilgisi oluştur" u "Yok" olarak değiştirin ve bu iş görür.


15
Bu, eklediğiniz herhangi bir nuget paketini etkilemeyecek, hala sahip olacakları pdbve xmldosyaları.
Lankymart

OctoPack özelliklerini csproj dosyamda kullanıyorum ve bu PDB ve XML dosyalarım için hile yaptı. Ayrıca VS 2015 kullanıyordum. Çıktı altında Oluştur -> Gelişmiş -> Çıktı altında Hata Ayıklama Bilgilerini Yok olarak ayarla
Devin Prejean

0

Cevabım şu anda önemsiz olabilir, ancak karşılık gelen bir dll varsa, xml dosyalarını silmek için kullandığım BAT komut dosyasını paylaşmak istiyorum. Yalnızca çıktı klasörünü temizlemek istiyorsanız ve kaldırmak istemeyen başka xml dosyalarına sahipseniz kullanışlıdır.

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!"
  )
)

Kullanımı:

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

Bu basit çalışmayı ("gecikmeli genişleme" sayesinde) burada ve burada her tür aramayla bitirmem bir saatimi aldı. Umarım benim gibi diğer BAT yeni başlayanlara yardımcı olur.


0

Diğer cevaplarda pek şansım olmadı, sonunda yerleşik "Sil" komutunu kullanarak bunu uygulamamda nasıl yapacağımı anladım , görünüşe göre joker karakterleri uygulamak için özel bir yol var , biraz farklı , işte "CSPROJ" 'unuza ( TargetDir yerleşik bir değişkendir, otomatik olarak dahil edilir) "Proje" etiketinin altına koymanız gereken her şey :

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

Ayrıca, çeşitli dillere özgü klasörlerin oluşturulmasında sorun yaşadım, bu sorunu da yaşıyorsanız, kullanılmayan dile özgü klasörleri de kaldırabilirsiniz. Bunu yalnızca "Sürüm" derleme türü altında tetiklemeyi seçtim:

<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>

-3

Yalnızca XML dosyalarını hariç tutmak istiyorsanız (örneğin, bir hata ayıklama sürümü) aşağıdaki gibi bir şey yapabilirsiniz:

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

Temel olarak, listelenen her uzantı (noktalı virgülle ayrılmış) hariç tutulacaktır.


1
Bu soru ve kabul edilen cevabı 4 yaşında ve cevabınız, kabul edilen cevabın neredeyse bir kopyası ve yapıştırılması.
Zack

1
Farklı olan, ihtiyacım olan şey olan sadece XML dosyaları için sözdizimi. Bu etiketin doğru söz dizimi için biraz araştırma yapmam gerekiyordu. Orijinal yanıtı faydalı buldum ve oy verdim, ancak belirli bir dosya türünü filtrelemeleri gerektiğinde başka birine biraz zaman kazandırabileceğimi düşündüm.
ProVega

11
Ama bu olmayacak dahil xml dosyaları, bunu dışlamak değil?
David Gardiner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.