2015-01-13 12 views
6

यह सामान्य समस्या है जो मैं आमतौर पर पढ़ता हूं, जो लोग NuGet पैकेज में फ़ाइलों को शामिल करने का प्रयास कर रहे हैं। मैं फ़ाइल को स्वचालित रूप से शामिल होने से रोकने की कोशिश कर रहा हूं।NuGet पैक: डिफ़ॉल्ट रूप से अनदेखा करें

मैं पूर्व-संकलित एमवीसी व्यू टेम्पलेट्स (RazorGenerator.Mvc का उपयोग करके), .less फ़ाइलों का उपयोग कर रहा हूं, और जावास्क्रिप्ट को आवश्यकतानुसार इन्हें समर्थन देने के लिए बना रहा हूं। विचार यह है कि ये बुनियादी चीजें हैं जो हमारी सभी साइटों में जाती हैं।

डिफ़ॉल्ट रूप से, nuget pack शामिल किसी भी फाइल कार्रवाई बिल्ड चिह्नित: अपनी परियोजना है, जो किसी भी नव निर्मित देखने के लिए, .less फ़ाइल, या स्क्रिप्ट होगा में सामग्रीइस व्यवहार को ओवरराइड करने का कोई विकल्प नहीं लगता है। यहां एक संबंधित प्रश्न ने empty <files> node in the .nuspec to stop all includes का समाधान प्रस्तुत किया है, लेकिन मैं कुछ फ़ाइलों को शामिल करना चाहता हूं, केवल वही जिन्हें मैं चुनता हूं।

अब, एक कामचलाऊ के रूप में, मैं के माध्यम से जा सकते हैं, सब कुछ स्पष्ट रूप से सेट होने के लिए नहीं सामग्री, तो स्पष्ट रूप से सेटअप जो फाइलें मैं करता हूँ और कॉपी किया जाना नहीं चाहते हैं और जहां मैं उन्हें चाहते हैं (कोई नहीं बजाय का उपयोग) .nuspec फ़ाइल का उपयोग करने के लिए कॉपी किया गया। हालांकि, यदि कोई अन्य डेवलपर मेरे भविष्य के साथ आता है, और इस चरण को भूल जाता है, तो नई-जोड़े वाली फ़ाइलों को पैकेज में कॉपी किया जाएगा, और उसके बाद अगले प्रोजेक्ट या अपडेट के दौरान गंतव्य प्रोजेक्ट में कॉपी किया जाएगा।

मैं OctoPack, और डिफ़ॉल्ट रूप से कुछ भी नहीं है जैसे ही यह .nuspec में एक <files> नोड का पता लगाता है कि सहित इच्छा पाया है, लेकिन मैं और कुछ का उपयोग कर रहा नहीं TeamCity से, और अपने निर्माण सर्वर स्क्रिप्ट को फिर से लिखने के लिए कैसे को समझने के लिए न्यूज पैक के बजाय ऑक्टोपैक का आह्वान करें मुझे एक महान विकल्प के रूप में नहीं मारा जाता है। ऑक्टोपैक में भी सीमाएं हैं; निर्भरताओं को मैन्युअल रूप से सूचीबद्ध किया जाना चाहिए, .nuspec फ़ाइल के प्रतिस्थापन टोकन को कमांड लाइन पर पास किया जाना चाहिए (AssemblyInfo.cs से पढ़ने के बजाय), और ऐसा लगता है कि उपकरण इस उपयोग के लिए नहीं था - वे यहां तक ​​कि "ऑक्टोपैक केवल उन परियोजनाओं पर स्थापित होना चाहिए जिन्हें आप तैनात करने जा रहे हैं - इसका मतलब है कंसोल एप्लिकेशन प्रोजेक्ट, विंडोज सर्विस प्रोजेक्ट्स, और एएसपी.नेट वेब अनुप्रयोग। यूनिट परीक्षण, कक्षा पुस्तकालय, और अन्य सहायक परियोजनाओं का चयन नहीं किया जाएगा । " (OctoPack Documentation)

अगले विकल्प मैं msbuild उपयोग कर रहा था बस BeforeBuild घटना के दौरान सामग्री समूह का सफाया करने की कोशिश की:

<Target Name="BeforeBuild"> 
    <ItemGroup> 
     <Content Remove="**\*.*" /> 
     <None Include="**\*.*" /> 
    </ItemGroup> 
    <Message Text="Content files: @(Content)" Importance="High" /> 
</Target> 

संदेश पुष्टि करता है कि सामग्री समूह रिक्त है, लेकिन nuget pack प्रतीत नहीं होता देखभाल करने के लिए; इसमें अभी भी सभी फाइलें शामिल हैं।

क्या किसी ने मैन्युअल रूप से सबकुछ चिह्नित किए बिना इस तरह के पैकेज को सफलतापूर्वक बनाया है बिल्ड बिल्ड: कोई नहीं और ऑक्टोपैक का उपयोग किए बिना?

उत्तर

5

ऐसा लगता है कि अगर आप nuget pack MyProject.nuspec आह्वान (बस nuget pack के बजाय, दोनों .csproj और .nuspec के लिए दिखाई देंगे), आप वांछित व्यवहार प्राप्त कर सकते हैं, हालांकि आप अभी भी (OctoPack साथ की तरह) टोकन प्रतिस्थापन और स्वत: खो निर्भरता। तो यह एक आदर्श समाधान नहीं है, जो --no-default-content जैसा कुछ होगा, लेकिन यह काम पर्याप्त रूप से पर्याप्त हो जाता है।

nuget pack MyProject.nuspec -Properties version={XYZ} (जहां XYZ बिल्ड सर्वर द्वारा भरा हुआ है) कम से कम मुझे यह सुनिश्चित करने देगा कि संस्करण संख्या भी सही ढंग से बढ़ी है। उदाहरण के लिए, मैं .nuspec

<version>1.1.0.$version$</version> में सेट कर सकता हूं और अंतिम भाग के रूप में केवल एसवीएन संशोधन का उपयोग कर सकता हूं।

+0

"तो यह एक सही समाधान नहीं है, जो '--no-default-content'' जैसा कुछ होगा - एक और सही समाधान आपको इसे नियंत्रित करने के लिए .nuspec फ़ाइल में कुछ लिखने देगा। हर बार 'nuget' पास करने के लिए पैरामीटर याद रखने के काम पर कौन जा रहा है? – binki

+0

निरंतर एकीकरण सर्वर का उपयोग करने वाले किसी को भी याद रखना नहीं है। अब मुझे याद रखना होगा कि यदि मैं एक नई निर्भरता जोड़ता हूं या एक निर्भरता संस्करण बदलता हूं, तो मुझे पैकेज.config से उस डेटा को पढ़ने में सक्षम होने के बजाय मैन्युअल रूप से इसे nuspec में जोड़ना होगा। –

0

एक और समाधान (अभी भी आदर्श नहीं है, लेकिन कम से कम आप .csproj फ़ाइल को पास कर सकते हैं और इसके फायदे नहीं खो सकते हैं) परिणामी .nupkg फ़ाइल के सामग्री फ़ोल्डर को हटाना है (इसे .zip के रूप में इलाज करके)।

यह करने के लिए एक आसान तरीका है इस तरह एक स्क्रिप्ट के माध्यम से है:

Remove files from .zip file with Powershell

ध्यान दें कि System.IO.Compression - इस स्क्रिप्ट के द्वारा प्रयोग किया - केवल PowerShell 3.0 और .NET 4.5 के साथ काम करता है।

संबंधित मुद्दे