2015-01-28 10 views
5

मैं nuget pack जरूरत है केवल 3 अंक के साथ एक पैकेज संस्करण (हम इस पर अर्थ संस्करण करना चाहते हैं), लेकिन जब मैं एक csproj जो एक AssemblyVersion विशेषता निर्धारित है पर इसे कहते उत्पन्न करने के लिए पर अंकों की संख्या का सम्मान नहीं करता है "1.0.0" तक, परिणामस्वरूप nupkg फ़ाइल इसके मेटाडेटा (और फ़ाइल नाम) में संस्करण "1.0.0.0" के साथ समाप्त होती है। कमांड लाइन उपकरण AssemblyVersion विशेषता पर निर्दिष्ट अंकों की मात्रा का सम्मान क्यों नहीं करता है?Nuget पैक विधानसभा संस्करण

मैंने इसे csproj फ़ाइल के विरुद्ध nuget spec पर कॉल के साथ शुरू किया, जो इस तरह की एक स्टब nuspec फ़ाइल उत्पन्न करता है (इसमें वास्तव में प्लेसहोल्डर मूल्यों के साथ अधिक टैग शामिल हैं, लेकिन मैंने उन्हें हटा दिया है क्योंकि हमें उनकी आवश्यकता नहीं है):

<?xml version="1.0"?> 
<package > 
    <metadata> 
    <id>$id$</id> 
    <version>$version$</version> 
    <title>$title$</title> 
    <authors>$author$</authors> 
    <owners>$author$</owners> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>$description$</description> 
    <releaseNotes>Release notes.</releaseNotes> 
    <copyright>Copyright 2015</copyright> 
    </metadata> 
</package> 
इस nuspec csproj फ़ाइल को उसी फ़ोल्डर में TFS में जाँच की फ़ाइल के साथ

, अब हम इस तरह पैक कॉल कर सकते हैं:

nuget pack MyProject.csproj 

परियोजना की AssemblyInfo.cs फ़ाइल स्थापित करने के लिए एक पंक्ति में शामिल संस्करण स्पष्ट रूप से:

[assembly: AssemblyVersion("1.0.0")] 

यह सब ठीक काम कर रहा है, इस तथ्य को छोड़कर कि उपकरण 4 अंकों का उपयोग कर रहा है जब यह असेंबली संस्करण पुनर्प्राप्त करता है। यहां तक ​​कि विंडोज़ केवल 3 अंकों के साथ संस्करण दिखाता है जब मैं फ़ाइल एक्सप्लोरर पर डीएलएल पर राइट क्लिक करता हूं और विवरण पर जाता हूं। NuGet 4 अंकों का उपयोग क्यों कर रहा है? क्या मैं शायद कुछ स्पष्ट याद कर रहा हूँ?

नुस्पेक में संस्करण हार्डकोडिंग स्पष्ट रूप से आदर्श नहीं है, क्योंकि तब हमें संस्करण संख्या को दो अलग-अलग स्थानों में बनाए रखना होगा, जबकि वे हमेशा एक जैसा होने का इरादा रखते हैं। मेरा मतलब है, यह विशेष प्लेसहोल्डर मूल्य $version$ के पीछे विचार होना चाहिए था कि NuGet खुद को परियोजना से निकालने के बारे में जानता है।

उत्तर

8

Creating and Publishing a Package में यह कहा गया है कि NuGet का उपयोग करता AssemblyVersionAttribute विशेषता जब टोकन $version$ प्रयोग किया जाता है है।
NuGet स्रोत कोड में खोदना, मैंने पाया है कि यह सीधे आगे नहीं है जैसा कि कोई सोच सकता है।

NuGet आपकी लाइब्रेरी के संस्करण को प्राप्त करने के लिए प्रतिबिंब का उपयोग करता है। AssemblyName.Version सटीक होने के लिए। चूंकि संस्करण के सभी घटक शून्य से अधिक या बराबर पूर्णांक होना चाहिए (AssemblyName.Version देखें), प्रस्तुत संस्करण 1.0.0.0 (आपके मामले में) 1.0.0 के बजाय आपके AssemblyVersion विशेषता में घोषित किया गया है।

संभव समाधान
Nuspec Reference पेज $version$ टोकन के बगल में अधिक जानकारी कहते हैं। यह AssemblyInformationalVersionAttribute का उल्लेख AssemblyVersionAttribute पर प्राथमिकता प्राप्त करेगा। इसका उपयोग करने से आपकी समस्या हल हो जाएगी।

गहरी खुदाई
शायद आप सोच सकते क्यों करेंगे AssemblyInformationalVersionAttribute काम और AssemblyVersionAttribute नहीं होगा?

उस प्रश्न का उत्तर है कि NuGet पहले यह Assembly.Version का उपयोग करता है, अपने पुस्तकालय की विशेषताओं को पुनः प्राप्त करने CustomAttributeData.GetCustomAttributes(Assembly) फ़ंक्शन का उपयोग करता है। उपर्युक्त फ़ंक्शन AssemblyVersionAttribute सूचीबद्ध नहीं करेगा, फिर भी यह असेंबली पर उपयोग किए जाने पर AssemblyInformationalVersionAttribute सूचीबद्ध करेगा। तभी, यदि असेंबली इन्फॉर्मेशन VersionAttribute नहीं मिला, असेंबली। संस्करण का उपयोग किया जाएगा।

संपादित करें:
प्रासंगिक NuGet स्रोत कोड:

Assembly assembly = Assembly.ReflectionOnlyLoadFrom(path); 
AssemblyName assemblyName = assembly.GetName(); 
... 
version = new SemanticVersion(assemblyName.Version); 

समस्या assembly.GetName साथ शुरू होता है:
NuGet विधानसभा संस्करण प्राप्त करने के (यदि AssemblyInformationalVersionAttribute नहीं मिला था) निम्नलिखित कोड का उपयोग करता है() के रूप में यह संस्करण सहित प्रासंगिक मानकों के साथ विधानसभा नाम बनाता है और शुरू करता है।
(यह कोड AssemblyMetadataExtractor कक्षा में पाया जा सकता है, public AssemblyMetadata GetMetadata(string path) समारोह के तहत।)

+0

यह दिलचस्प है ... मुझे लगता है कि मैं बिना किसी परेशानी के 'विधानसभा सूचना' का उपयोग कर सकता हूं, भले ही यह आदर्श न हो। मुझे आश्चर्य है कि जब मैं डीएलएल फ़ाइल के विवरण पृष्ठ पर जाता हूं तो विंडोज अंकों की सही संख्या कैसे दिखा सकता है। मुझे लगता है कि NuGet उस निकालने के लिए एक ही तर्क का उपयोग करने में सक्षम होगा। इसके बारे में कोई शब्द? – julealgon

+0

इसके अलावा, क्या आप NuGet स्रोत के प्रासंगिक हिस्सों को पोस्ट कर सकते हैं जो शायद इससे निपटते हैं? ['संस्करण' स्रोत] को देखकर (http://referencesource.microsoft.com/#mscorlib/system/version.cs,0c15515dfe051d35) यह मेरे लिए बहुत स्पष्ट है कि यह 2 और 3 अंकों के संस्करणों का समर्थन करता है। आप देख सकते हैं कि इसके लिए विभिन्न कन्स्ट्रक्टरों का एक समूह है, और यह कि 'ToString' अधिभार है, यह ध्यान में रखता है कि कौन से फ़ील्ड निर्दिष्ट किए गए थे और जो नहीं थे, उनके मूल्यों को -1 के विरुद्ध जांचकर। मेरे मामले में, 'Version.ToString()' जैसा कि मैंने अपेक्षा की थी "1.0.0" वापस कर देगा। – julealgon

+0

उल्लिखित विशेषताओं के साथ कुछ मज़ेदार मुझे निम्नलिखित के लिए प्रेरित करते हैं - लाइब्रेरी के विंडोज़ विवरण पृष्ठ में पाए गए उत्पाद संस्करण प्रॉपर्टी निम्नलिखित क्रम में असेंबली विशेषता में मिले संस्करण को दिखाएगी: (ए) 'असेंबली इंफॉर्मेशन वर्जन', (बी) 'असेंबलीफाइलवर्सन', (सी) 'असेंबली वर्जन' (अर्थात् (ए) प्राथमिकता लेता है, फिर (बी), फिर (सी))। क्या होता है जब आप केवल 'असेंबली वर्जन' विशेषता निर्दिष्ट करते हैं ("1.0 के साथ।0 "पैरामीटर के रूप में, उदाहरण के लिए)? विंडोज उत्पाद संस्करण" 1.0.0.0 "दिखाएगा। और मेरा मानना ​​है कि वह गुम टुकड़ा था जिसे आप ढूंढ रहे थे। – Peas

1

यह एक ही समस्या में पड़ गए और nuget की "-संस्करण" विशेषता का उपयोग कर इसे हल किया। यह nuspec फ़ाइल से संस्करण ओवरराइड करता है। अर्थपूर्ण संस्करण के लिए अद्भुत काम करता है।

उपरोक्त के आधार पर, मुझे लगता है कि यह चर्चा शुरू होने के समय उपलब्ध नहीं थी।

1

NuGet आपके द्वारा निर्दिष्ट के रूप में

मैं भी कुछ करने के लिए AssemblyVersion सेट करेंगे 2 या 3 घटकों और nuget करने के लिए एक संस्करण के रूप में [assembly: AssemblyInformationalVersion()] का उपयोग करने की, नहीं है और न ही AssemblyVersionAssemblyFileVersion

सेट AssemblyInformationalVersion पैकेज बिल्कुल लगता है ऑटो की संख्या बढ़ बात के बाद से यह यह संस्करण बदलता है हर समय तो यह यह

के बारे में स्मार्ट बनने की कोशिश नहीं कर रहा है सोचने के लिए मजबूर करने के लिए यह सुरक्षित है मेरी MSBuild अनुभव पर .NET द्वारा इस्तेमाल किया और आधारित है युक्त

Project.dll 

मेटाडाटा के साथ (के रूप में ILSpy द्वारा रिपोर्ट) ..., Version=1.0.6246.25505, Culture=neutral, PublicKeyToken=null...

तो तुम अच्छा nuget संस्करण और मूर्ख सबूत विधानसभा संस्करण (हमेशा इतनी बदल रहा प्राप्त

Project.1.0.nupkg 

में

परिणाम नहीं अजीब कैशिंग बनाता है जब पैकेज संस्करण समान रहता है, स्थानीय परीक्षण के लिए कहें)

Source

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