संदर्भित असेंबली PDB और XML फ़ाइलों को आउटपुट के लिए कॉपी किया गया


118

मेरे पास विज़ुअल स्टूडियो 2008 C # /। NET 3.5 परियोजना है जिसमें सामग्री पोस्ट करने के लिए पोस्ट बिल्ड कार्य है। हालाँकि मुझे लग रहा है कि मैं अपनी आउटपुट डायरेक्टरी (और ज़िप) में संदर्भित विधानसभाओं '.pdb (डीबग) और .xml (डॉक्यूमेंटेशन) फ़ाइलों को भी प्राप्त कर रहा हूँ।

उदाहरण के लिए, यदि MyProject.csproj YourAssembly.dll का संदर्भ देता है और DLA के रूप में उसी निर्देशिका में YourAssembly.xml और YourAssembly.pdb फ़ाइलें हैं, जो वे मेरे आउटपुट निर्देशिका (और ज़िप) में दिखाएंगे।

मैं * .pdb को बाहर कर सकता हूं जब ZIP'ing लेकिन मैं * .xml फ़ाइलों को बाहर नहीं कर सकता क्योंकि मेरे पास एक ही एक्सटेंशन के साथ तैनाती फ़ाइलें हैं।

क्या प्रोजेक्ट को संदर्भित असेंबली PDB और XML फ़ाइलों की प्रतिलिपि बनाने से रोकने का कोई तरीका है?

जवाबों:


68

आप इसे कमांड लाइन के माध्यम से भी निर्दिष्ट कर सकते हैं:

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

9
यह जाने का रास्ता दिखता है क्योंकि आप इसे अपनी बिल्ड परिभाषा MSBuild तर्कों में शामिल कर सकते हैं और csproj फ़ाइलों को हैक नहीं करना है।
मफिन मैन

2
यह टीएफएस से महान काम करता है और मेरे मामले में 100s परियोजनाओं को संशोधित करने के लिए बचाता है
चरण-फू

TFS2018 और गैर-XAML स्टाइल बिल्ड के साथ भी बढ़िया काम करता है।
knipp

साफ और त्वरित समाधान। धन्यवाद
करण

158

मैं अपने प्राथमिक अनुप्रयोग में संदर्भित असेंबली को जोड़ने और हटाने में सक्षम होना चाहता था, जबकि यह सुनिश्चित करने के लिए कि मुझे कौन सी फ़ाइलों को हटाने या बाहर करने की आवश्यकता है, से बचना चाहिए।

मैं Microsoft.Common.targetsऐसी चीज़ की तलाश में था जो काम करे और AllowedReferenceRelatedFileExtensionsसंपत्ति पाए । यह .pdb; .xmlतो मैं स्पष्ट रूप से अपनी परियोजना फ़ाइल में इसे परिभाषित करने के लिए चूक । पकड़ यह है कि आपको कुछ चाहिए (व्हॉट्सएप पर्याप्त नहीं है) अन्यथा यह अभी भी डिफ़ॉल्ट का उपयोग करेगा।

<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
यह "सही" तरीका हो सकता है लेकिन यह इतना छिपा है जो मेरी किताबों में बुरा है।
म्लादेन मिहाजलोविच

1
विजुअल स्टूडियो आईडीई से निर्माण करते समय यह काम करता है। हालाँकि, यह मेरे लिए काम नहीं किया जब MSBuild के माध्यम से निर्माण। अगर यह प्रोजेक्ट फ़ाइल में है तो मुझे इसे / p विकल्प के रूप में निर्दिष्ट करने की आवश्यकता नहीं है।
Redcurry

19

आप के समान पोस्ट बिल्ड ईवेंट कमांड जोड़ सकते हैं del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


धन्यवाद। यह काम करता है यदि आपके पास संदर्भित विधानसभाओं की एक स्थिर सूची है। हमारे मामले में हालांकि हमारे पास दो दर्जन से अधिक थे, उनमें से कई के साथ प्रवाह में थे, जबकि हमने फिर से काम किया।
जेसन मोर्स

4
व्यक्तिगत रूप से मुझे लगता है कि यह सही उत्तर है-दूसरे तरीके से आपने प्रोजेक्ट फ़ाइल को हैक कर लिया है और किसी और (या खुद वर्षों बाद) को यह नहीं पता होगा कि इसे रोकने के लिए कहां देखना है।
म्लादेन मिहाजलोविच

1
मैं इस तरह से भी पसंद करता हूं। मुझे जो कुछ भी होने की जरूरत है (या पहली जगह में होने के लिए डिज़ाइन किया गया था) को खत्म करने देना पसंद करता हूं और फिर पोस्ट बनाने की घटनाओं को ऐसा बनाने देता हूं जैसे मैं इसे अंत में चाहता हूं। यह सिर्फ इस तरह से बहुत क्लीनर लगता है!
अरवो बोवेन

यहां तक ​​कि इस समाधान काम करता है, यह वास्तव में अनुकूलित नहीं है क्योंकि आप ढीला समय की नकल करते हैं जो आप हटा देंगे। मैंने हमेशा हैक के रूप में प्री / पोस्ट बिल्ड चरणों पर विचार किया है क्योंकि वे लक्ष्य या proj फ़ाइलों की तुलना में बिल्ड सिस्टम में काम नहीं करते हैं।
क्रिसमस

वाह @ christ.s, * चकली * मुझे उम्मीद है कि दस साल में जब से मैंने इस सवाल का जवाब दिया है विज़ुअल स्टूडियो टीम ने इसे आसान बना दिया होगा। :-)
एंड्रयूजैकसनजेडा

5

यह एक पुराना सवाल है, लेकिन चूंकि यूआई के माध्यम से पीडीबी और एक्सएमएल फ़ाइलों को उत्पन्न करने के तरीके को बंद करने के बारे में कोई जवाब नहीं है, इसलिए मुझे लगा कि यह पूर्णता के लिए यहां होना चाहिए।

विज़ुअल स्टूडियो 2013 में: कंपाइल टैब के तहत प्रोजेक्ट प्रॉपर्टीज में, "XML डॉक्यूमेंट फाइल जेनरेट करें" को अनचेक करें, फिर उसके नीचे "एडवांस्ड कंपाइल ऑप्शन्स" पर क्लिक करें और "जेनरेट डीबग इंफोर्मेशन" को "नो" में बदलें, और वह ट्रिक करेगा।


15
यह आपके द्वारा शामिल किए गए किसी भी नगेट पैकेज को प्रभावित नहीं करेगा pdbऔर उनके पास अभी भी xmlफाइलें होंगी ।
लंकिमार्ट

मैं अपनी csproj फ़ाइल में OctoPack गुणों का उपयोग कर रहा हूं और इसने मेरी PDB और XML फ़ाइलों के लिए चाल चली। मैं वी। एस। 2015 का भी उपयोग कर रहा था। बिल्ड -> एडवांस्ड अंडर आउटपुट -> डिबग इंफो टू
नो

0

मेरा जवाब अब तुच्छ हो सकता है, लेकिन अगर मैं इसके लिए एक इसी dll वहाँ xml फ़ाइलों को नष्ट करने के लिए उपयोग BAT स्क्रिप्ट साझा करना चाहते हैं। यह उपयोगी है यदि आप आउटपुट फ़ोल्डर को साफ करना चाहते हैं और अन्य xml फाइलें हैं जिन्हें हटाना नहीं चाहते हैं।

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

उपयोग:

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

इस सरल कार्य को पूरा करने में मुझे एक घंटे का समय लगा (यहां तक ​​कि सभी प्रकार की खोज के साथ "विलंबित विस्तार" सामान के लिए धन्यवाद)। आशा है कि यह मेरी तरह अन्य बैट नए मदद करता है।


0

मेरे पास अन्य उत्तरों के साथ बहुत अधिक भाग्य नहीं था, मैंने आखिरकार "हटाएं" आदेश में निर्मित का उपयोग करके अपने कार्यान्वयन में ऐसा कैसे किया , जाहिर है कि वाइल्डकार्ड को लागू करने के लिए एक विशिष्ट तरीका है , यह थोड़ा बारीक है , यहां है वह सब कुछ जो आपको अपने " CSPROJ " में डालना है ( टारगेट एक " वैरिएबल में बनाया गया है, स्वचालित रूप से शामिल किया गया है") "नीचे":

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

मुझे विभिन्न भाषा विशिष्ट फ़ोल्डरों के उत्पन्न होने में भी परेशानी हुई है, यदि आपके पास भी यह समस्या है, तो आप अप्रयुक्त भाषा के विशिष्ट फ़ोल्डरों को भी हटा सकते हैं। मैंने इसे केवल बिल्ड टाइप "रिलीज़" के तहत ट्रिगर करने के लिए चुना है:

<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

यदि आप केवल XML फ़ाइलों (डिबग रिलीज़ के लिए) को बाहर करना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं:

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

मूल रूप से, प्रत्येक एक्सटेंशन (एक अर्ध-बृहदान्त्र द्वारा सीमांकित) को बाहर रखा जाएगा।


1
यह सवाल और इसका स्वीकृत उत्तर 4 साल पुराना है, और आपका उत्तर लगभग स्वीकृत उत्तर की कॉपी-पेस्ट है।
ज़ैक

1
जो अलग है वह सिर्फ XML फाइलों के लिए वाक्यविन्यास है जो मुझे चाहिए था। मुझे इस टैग के उचित सिंटैक्स के लिए कुछ शोध करना था। मुझे मूल उत्तर मददगार लगा और इसे वोट दिया, लेकिन मुझे लगा कि मैं किसी और को बचा सकता हूं अगर उन्हें किसी विशिष्ट फ़ाइल प्रकार को फ़िल्टर करने की आवश्यकता होती है।
प्रोविगा

11
लेकिन क्या इसमें xml फाइलें शामिल नहीं होंगी , इसे बाहर नहीं किया जाएगा?
डेविड गार्डिनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.