मूल उत्पादन परियोजना के लिए NuGet पैकेज से मूल फाइलें जोड़ें


126

मैं एक नेट नेट असेंबली के लिए NuGet पैकेज बनाने की कोशिश कर रहा हूं जो एक देशी win32 dll को पिनवोक करता है। मुझे असेंबली और देशी dll दोनों को पैक करना होगा। असेंबली के साथ प्रोजेक्ट रेफ़रेंस (इस भाग में कोई समस्या नहीं) जोड़ा गया है और देशी dll को प्रोजेक्ट आउटपुट डायरेक्टरी या किसी अन्य रिलेटिव डायरेक्टरी में कॉपी किया जाना चाहिए।

मेरे प्रश्न हैं:

  1. मैं विज़ुअल स्टूडियो के बिना देशी डीएल कैसे पैक करूं, इसे संदर्भ सूची में जोड़ने की कोशिश कर रहा हूं?
  2. क्या मुझे देशी dll की प्रतिलिपि बनाने के लिए install.ps1 लिखना होगा? यदि हां, तो मैं इसे कॉपी करने के लिए पैकेज की सामग्री का उपयोग कैसे कर सकता हूं?

1
रनटाइम / आर्किटेक्चर विशिष्ट पुस्तकालयों के लिए समर्थन है, लेकिन सुविधा प्रलेखन में कमी है और यह यूडब्ल्यूपी विशिष्ट प्रतीत होता है। docs.microsoft.com/en-us/nuget/create-packages/…
Wouter

जवाबों:


131

का उपयोग करते हुए Copyलक्ष्यों को फ़ाइल में लक्ष्य कॉपी करने के लिए आवश्यक पुस्तकालयों अन्य परियोजनाओं जो इस परियोजना का संदर्भ, एक में जिसके परिणामस्वरूप के लिए उन फ़ाइलों की प्रतिलिपि नहीं होंगे DllNotFoundException। यह एक बहुत ही सरल लक्ष्य फ़ाइल के साथ किया जा सकता है, हालांकि, एक Noneतत्व का उपयोग करते हुए , क्योंकि MSBuild सभी Noneफाइलों को संदर्भित परियोजनाओं में कॉपी करेगा ।

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

buildआवश्यक देशी पुस्तकालयों के साथ नगेट पैकेज की निर्देशिका में लक्ष्य फ़ाइल जोड़ें । लक्ष्य फ़ाइल dllमें निर्देशिका की सभी बाल निर्देशिकाओं में सभी फ़ाइलें शामिल होंगी build। इसलिए एक प्रबंधित असेंबली द्वारा उपयोग किए गए एक देशी पुस्तकालय के संस्करण x86और x64संस्करण को जोड़ने के लिए आप Any CPUनिम्नलिखित के समान निर्देशिका संरचना के साथ समाप्त होंगे:

  • निर्माण
    • 86
      • NativeLib.dll
      • NativeLibDependency.dll
    • 64
      • NativeLib.dll
      • NativeLibDependency.dll
    • MyNugetPackageID.targets
  • lib
    • net40
      • ManagedAssembly.dll

निर्मित होने पर परियोजना के आउटपुट निर्देशिका में समान x86और x64निर्देशिकाएं बनाई जाएंगी। यदि आपको उपनिर्देशिका की आवश्यकता नहीं है, तो **और %(RecursiveDir)हटाया जा सकता है और इसके बजाय buildसीधे निर्देशिका में आवश्यक फ़ाइलों को शामिल करें । अन्य आवश्यक सामग्री फ़ाइलों को भी उसी तरह से जोड़ा जा सकता है।

Noneविज़ुअल स्टूडियो में खुलने पर लक्ष्य फ़ाइल में जोड़ी गई फ़ाइलें प्रोजेक्ट में नहीं दिखाई देंगी। अगर आप सोच रहे हैं कि मैं Contentफ़ोल्डर का उपयोग nupkg में क्यों नहीं कर रहा हूं, क्योंकि इसमें पॉवरशेल स्क्रिप्ट का उपयोग किए बिनाCopyToOutputDirectory तत्व सेट करने का कोई तरीका नहीं है (जो केवल विजुअल स्टूडियो के अंदर चलाया जाएगा, कमांड प्रॉम्प्ट से नहीं, बिल्ड सर्वर पर या में अन्य IDEs, और project.json / xproj DNX परियोजनाओं में समर्थित नहीं है ) और मैं परियोजना के भीतर फ़ाइलों की एक अतिरिक्त प्रतिलिपि होने के बजाय फ़ाइलों का उपयोग करना पसंद करता हूं ।Link

अद्यतन: हालांकि यह भी इसके साथ काम करना चाहिए Contentबल्कि Noneयह प्रतीत होता है कि एमएसबिल्ट में एक बग है, इसलिए फ़ाइलों को संदर्भित परियोजनाओं में एक से अधिक चरण हटाए जाने पर कॉपी नहीं किया जाएगा (जैसे proj1 -> proj2 -> proj3, proj3 फाइलें नहीं मिलेंगी proj1 के NuGet पैकेज से लेकिन proj2 होगा)।


4
सर, आप एक प्रतिभाशाली हैं! एक जादू की तरह काम करता है। धन्यवाद।
मूनस्टोम ऑक्ट

आश्चर्य है कि स्थिति की '$(MSBuildThisFileDirectory)' != '' And HasTrailingSlash('$(MSBuildThisFileDirectory)')आवश्यकता क्यों है ? मुझे लगा कि MSBuildThisFileDirectoryहमेशा सेट है। जब ऐसा नहीं होगा?
किमी किमी

@kkm ईमानदारी से। मुझे नहीं लगता कि इसकी जरूरत है। मैं यह भी याद नहीं कर सकता कि मुझे मूल रूप से कहां से मिला।
kjbartel

@ किमी मैंने मूल रूप से System.Data.SQLite नगेट पैकेज को संशोधित किया है और ऐसा लगता है कि मैंने पीछे छोड़ दिया जब मैंने सभी अन्य बकवास को शामिल कर लिया था। मूल लक्ष्य फ़ाइल
kjbartel

2
@SuperJMN वहाँ वाइल्डकार्ड हैं। क्या आपने ध्यान नहीं दिया **\*.dll? वह .dllसभी निर्देशिकाओं में सभी फ़ाइलों की प्रतिलिपि बना रहा है । आप आसानी से **\*.*एक पूरी निर्देशिका पेड़ की नकल कर सकते हैं ।
kjbartel

30

मुझे हाल ही में एक ही समस्या थी, जब मैंने एक प्रबंधित और असेंबली साझा लिरिरीज़ (जिसमें एक x86उपनिर्देशिका में भी रखा जाना था ) दोनों में EmguCV NuGet पैकेज बनाने की कोशिश की थी, जिसे प्रत्येक बिल्ड के लिए निर्मित आउटपुट निर्देशिका में स्वचालित रूप से कॉपी करना पड़ता था ।

यहाँ एक समाधान है जिसके साथ मैं आया था, जो केवल NuGet और MSBuild पर निर्भर करता है:

  1. /libपैकेज (स्पष्ट भाग) और गैर-प्रबंधित साझा पुस्तकालयों और संबंधित फ़ाइलों (जैसे .pdb संकुल) की निर्देशिका में प्रबंधित असेंबलियों को /buildउपनिर्देशिका में रखें ( नुगेट डॉक्स में वर्णित )।

  2. सभी गैर-प्रबंधित *.dllफ़ाइल अंत को कुछ अलग करने के लिए नाम बदलें , उदाहरण *.dl_के लिए, नुगेट को कथित असेंबलियों के बारे में गलत जगह पर रखने से रोकने के लिए उदाहरण के लिए ( "समस्या: असेंबली लिबास फ़ोल्डर के बाहर" )।

  3. निम्न सामग्री की तरह कुछ के साथ उपनिर्देशिका <PackageName>.targetsमें एक कस्टम फ़ाइल जोड़ें /build(विवरण के लिए नीचे देखें):

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <AvailableItemName Include="NativeBinary" />
      </ItemGroup>
      <ItemGroup>
        <NativeBinary Include="$(MSBuildThisFileDirectory)x86\*">
          <TargetPath>x86</TargetPath>
        </NativeBinary>
      </ItemGroup>
      <PropertyGroup>
        <PrepareForRunDependsOn>
          $(PrepareForRunDependsOn);
          CopyNativeBinaries
        </PrepareForRunDependsOn>
      </PropertyGroup>
      <Target Name="CopyNativeBinaries" DependsOnTargets="CopyFilesToOutputDirectory">
        <Copy SourceFiles="@(NativeBinary)"
              DestinationFiles="@(NativeBinary->'$(OutDir)\%(TargetPath)\%(Filename).dll')"
              Condition="'%(Extension)'=='.dl_'">
          <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
        </Copy>
        <Copy SourceFiles="@(NativeBinary)"
              DestinationFiles="@(NativeBinary->'$(OutDir)\%(TargetPath)\%(Filename).%(Extension)')"
              Condition="'%(Extension)'!='.dl_'">
          <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
        </Copy>
      </Target>
    </Project>
    

उपरोक्त .targetsफ़ाइल को लक्ष्य परियोजना फ़ाइल में NuGet पैकेज की स्थापना पर इंजेक्ट किया जाएगा और देशी पुस्तकालयों को आउटपुट निर्देशिका में कॉपी करने के लिए जिम्मेदार है।

  • <AvailableItemName Include="NativeBinary" /> परियोजना के लिए एक नया आइटम "बिल्ड एक्शन" जोड़ता है (जो विजुअल स्टूडियो के अंदर "बिल्ड एक्शन" ड्रॉपडाउन में भी उपलब्ध है)।

  • <NativeBinary Include=".../build/x86वर्तमान परियोजना में रखी गई देशी पुस्तकालयों को जोड़ता है और उन्हें कस्टम लक्ष्य के लिए सुलभ बनाता है जो उन फ़ाइलों को आउटपुट निर्देशिका में कॉपी करता है।

  • <TargetPath>x86</TargetPath>फ़ाइलों में कस्टम मेटाडेटा जोड़ता है और x86वास्तविक फ़ाइलों को वास्तविक आउटपुट निर्देशिका की उपनिर्देशिका में कॉपी करने के लिए कस्टम लक्ष्य बताता है ।

  • <PrepareForRunDependsOn ...ब्लॉक लक्ष्यों की सूची के लिए कस्टम लक्ष्य निर्माण पर निर्भर करता है, को देखने कहते हैं Microsoft.Common.targets जानकारी के लिए फ़ाइल।

  • कस्टम लक्ष्य CopyNativeBinariesमें दो कॉपी कार्य शामिल हैं। पहले वाला *.dl_अपने एक्सटेंशन को वापस मूल में बदलते हुए आउटपुट निर्देशिका में किसी भी फाइल को कॉपी करने के लिए जिम्मेदार है *.dll। दूसरा केवल एक *.pdbही स्थान पर बाकी (उदाहरण के लिए किसी भी फाइल) को कॉपी करता है । यह एक एकल कॉपी कार्य और एक install.ps1 स्क्रिप्ट द्वारा प्रतिस्थापित किया जा सकता है जिसे पैकेज स्थापना के दौरान सभी *.dl_फ़ाइलों का नाम बदलना था *.dll

हालाँकि, यह समाधान अभी भी मूल बायनेरिज़ को किसी अन्य प्रोजेक्ट के आउटपुट डायरेक्टरी में कॉपी नहीं करेगा, जिसमें एक शुरुआत में NuGet पैकेज शामिल है। आपको अभी भी अपने "अंतिम" प्रोजेक्ट में NuGet पैकेज का संदर्भ देना होगा।


4
" हालांकि, यह समाधान अभी भी मूल बायनेरिज़ को किसी अन्य प्रोजेक्ट के आउटपुट डायरेक्टरी में कॉपी नहीं करेगा, जिसमें एक संदर्भ है जिसमें शुरू में NuGet पैकेज शामिल है। आपको अभी भी अपने" अंतिम "प्रोजेक्ट में NuGet पैकेज का संदर्भ देना होगा। " मेरे लिए शो स्टॉपर। इसका आमतौर पर मतलब है कि आपको कई परियोजनाओं (जैसे इकाई परीक्षण) में नगेट पैकेज जोड़ने की आवश्यकता है अन्यथा आप DllNotFoundExceptionफेंक दिए जाते हैं।
kjbartel

2
चेतावनी के कारण फ़ाइलों आदि का नाम बदलने के लिए थोड़ा कठोर।

आप <NoWarn>NU5100</NoWarn>अपनी परियोजना फ़ाइल में जोड़कर चेतावनी को हटा सकते हैं
फ्लोरियन कोच

28

यहां एक विकल्प है जो परियोजना में मूल DLL को निम्न गुणों के साथ इंजेक्ट.targets करने के लिए उपयोग करता है ।

  • Build action = None
  • Copy to Output Directory = Copy if newer

इस तकनीक का मुख्य लाभ यह है कि देशी डीएलएल को आश्रित परियोजनाओं के bin/फ़ोल्डर में संक्रमणीय रूप से कॉपी किया जाता है ।

.nuspecफ़ाइल का लेआउट देखें :

NuGet पैकेज एक्सप्लोरर की स्क्रीन कैप्चर

यहाँ .targetsफ़ाइल है:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <None Include="$(MSBuildThisFileDirectory)\..\MyNativeLib.dll">
            <Link>MyNativeLib.dll</Link>
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
</Project>

यह इस तरह सम्मिलित करता है MyNativeLib.dllजैसे कि यह मूल परियोजना का हिस्सा था (लेकिन उत्सुकता से फ़ाइल विजुअल स्टूडियो में दिखाई नहीं दे रही है)।

फ़ोल्डर <Link>में गंतव्य फ़ाइल नाम सेट करने वाले तत्व को नोट करें bin/


कुछ .bat और .ps1 फ़ाइलों के साथ एक उपचार का काम करता है जिसे मुझे अपनी
एज़्योर

"(लेकिन उत्सुकता से फ़ाइल विजुअल स्टूडियो में दिखाई नहीं देती है)"। - प्रोजेक्ट फाइलों को VS खुद AFAIK द्वारा पार्स किया जाता है, इसलिए बाहरी .getget (या डायनामिक रूप से टार्गेट एक्जेक्यूशन में बनाई गई) चीजों को नहीं दिखाया जाता है।
किमी किमी

यह पहले से बदलने के अलावा अन्य उत्तर के लिए कैसे अलग Contentहै None?
kjbartel

3
वाह तुम तेज़ हो। वैसे भी, यदि आपने ऐसा करने के लिए चुना, तो आप कम से कम 'यह कैसे पूछ सकते हैं कि यह मेरे उत्तर से अलग है'। यह इमोजी मूल प्रश्न को संपादित करने, स्वयं इसका उत्तर देने और फिर अन्य लोगों की टिप्पणियों में आपके उत्तर को बढ़ावा देने से अधिक उचित होगा। यह उल्लेख करने के लिए कि मैं व्यक्तिगत रूप से इस विशेष उत्तर को
आपसे

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

19

अगर किसी और ने इस पार ठोकर खाई।

.targetsफ़ाइल नाम चाहिए बराबर NuGet पैकेज आईडी

कुछ भी काम नहीं करेगा।

क्रेडिट्स यहां जाएं: https://sushihangover.github.io/nuget-and-msbuild-targets/

मैं और अधिक अच्छी तरह से पढ़ा जाना चाहिए क्योंकि वास्तव में यहाँ उल्लेख किया है। मुझे उम्र ले गया ।।

एक प्रथा जोड़ें <PackageName>.targets


3
तुम मेरा पूरा दिन बचाओ!
यू

1
आपने कुछ और के साथ एक सप्ताह का लंबा मुद्दा तय किया। आपको और उस जीथूब पेज को धन्यवाद।
ग्लेन वाटसन

13

थोड़ी देर हो चुकी है लेकिन मैंने इसके लिए एक नगेट पैकेज बनाया है।

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

आपको केवल इतना करना है कि पैकेज में एक nuget निर्भरता जोड़ें http://www.nuget.org/packages/Baseclass.Contrib.Nuget.Output/

मैंने इसके बारे में ब्लॉग पोस्ट लिखी है: http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=6&mobile=0


वह तो कमाल है! हालांकि, यह केवल वर्तमान परियोजना में काम करता है। यदि परियोजना एक "क्लास लाइब्रेरी" है और आप उदाहरण के लिए एक "वेब एप्लिकेशन" पर निर्भरता के रूप में जोड़ना चाहते हैं।, DLL वेब एप्लिकेशन में नहीं बनाया जाएगा! मेरा "क्विक-फिक्स" है: अपनी लाइब्रेरी के लिए एक NuGet बनाएं, और क्लास लाइब्रेरी पर लागू करें, और निर्भरता के लिए एक और Nuget बनाएं (इस मामले में dll) और WebApplication पर लागू करें। इसके लिए कोई सबसे अच्छा उपाय?
वैगनर लियोनार्डी

आपको यह प्रोजेक्ट केवल .NET 4.0 (Windows) के लिए बनाया गया लगता है। क्या आप इसे पोर्टेबल क्लास लाइब्रेरी के समर्थन के लिए अपडेट करने की योजना बना रहे हैं?
Ani

1

एक शुद्ध C # समाधान है जो मुझे उपयोग करने में आसान लगता है और मुझे NuGet सीमाओं के साथ परेशान नहीं होना है। इन कदमों का अनुसरण करें:

अपनी परियोजना में मूल पुस्तकालय शामिल करें और अपनी बिल्ड एक्शन संपत्ति को इसमें सेट करें Embedded Resource

निम्न कोड को उस कक्षा में पेस्ट करें जहाँ आप इस लाइब्रेरी को PInvoke करते हैं।

private static void UnpackNativeLibrary(string libraryName)
{
    var assembly = Assembly.GetExecutingAssembly();
    string resourceName = $"{assembly.GetName().Name}.{libraryName}.dll";

    using (var stream = assembly.GetManifestResourceStream(resourceName))
    using (var memoryStream = new MemoryStream(stream.CanSeek ? (int)stream.Length : 0))
    {
        stream.CopyTo(memoryStream);
        File.WriteAllBytes($"{libraryName}.dll", memoryStream.ToArray());
    }
}

इस विधि को स्टैटिक कंस्ट्रक्टर से इस तरह से कॉल करें UnpackNativeLibrary("win32");और यह लाइब्रेरी को डिस्क से अनपैक कर देगा, बस आपको जरूरत है। बेशक, आपको यह सुनिश्चित करने की आवश्यकता है कि आपके पास डिस्क के उस हिस्से के लिए अनुमतियाँ हैं।


1

यह एक पुराना प्रश्न है, लेकिन मुझे अभी भी यही समस्या है, और मुझे एक ऐसा टर्नअराउंड मिला, जो थोड़ा मुश्किल है, लेकिन बहुत ही सरल और प्रभावी है: प्रत्येक विन्यास के लिए एक सबफ़ोल्डर के साथ निम्न संरचना में Nuget मानक सामग्री फ़ोल्डर में बनाएँ:

/Content
 /bin
   /Debug
      native libraries
   /Release
      native libraries

जब आप nuspec फ़ाइल पैक करते हैं, तो आपको डीबग और रिलीज़ फ़ोल्डर में प्रत्येक मूल लाइब्रेरी के लिए निम्न संदेश प्राप्त होगा:

मुद्दा: असेंबली बाहर कामगार फ़ोल्डर। विवरण: असेंबली 'Content \ Bin \ Debug \ ??????? dll' 'lib' फ़ोल्डर के अंदर नहीं है और इसलिए इसे एक प्रोजेक्ट में पैकेज स्थापित होने पर संदर्भ के रूप में नहीं जोड़ा जाएगा। समाधान: इसे 'lib' फ़ोल्डर में ले जाएं यदि इसे संदर्भित किया जाना चाहिए।

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

लाभ हैं:

  1. पैकेज के अनइंस्टॉल पर रीसेट करने के लिए मुश्किल प्रभावों के साथ कोई बोझिल स्क्रिप्ट के साथ सरल समाधान।
  2. स्थापित और अनइंस्टॉल करते समय Nuget देशी पुस्तकालयों को किसी अन्य सामग्री के रूप में प्रबंधित करता है।

नुकसान हैं:

  1. आपको प्रत्येक कॉन्फ़िगरेशन के लिए एक फ़ोल्डर की आवश्यकता है (लेकिन आमतौर पर केवल दो हैं: डीबग और रिलीज़, और यदि आपके पास अन्य सामग्री है जिसे प्रत्येक कॉन्फ़िगरेशन फ़ोल्डर में स्थापित किया जाना चाहिए, तो यह या तो जाने का तरीका है)
  2. प्रत्येक कॉन्फ़िगरेशन फ़ोल्डर में नेटिव लाइब्रेरीज़ को डुप्लिकेट किया जाना चाहिए (लेकिन यदि आपके पास प्रत्येक कॉन्फ़िगरेशन के लिए मूल लाइब्रेरीज़ के भिन्न संस्करण हैं, तो यह या तो जाने का तरीका है)
  3. प्रत्येक फ़ोल्डर में प्रत्येक मूल dll के लिए चेतावनी (लेकिन जैसा कि मैंने कहा, वे पैकेज निर्माता को पैकेज समय पर जारी किए जाते हैं, वीएस इंस्टॉल समय पर पैकेज उपयोगकर्ता के लिए नहीं)

0

मैं आपकी सटीक समस्या को हल नहीं कर सकता, लेकिन मैं आपको एक सुझाव दे सकता हूं।

आपकी मुख्य आवश्यकता है: "और क्या यह संदर्भ को ऑटो-रजिस्टर नहीं करता है" .....

तो आपको "समाधान आइटम" से परिचित होना पड़ेगा

यहाँ देखें संदर्भ:

एक NuGet पैकेज में समाधान-स्तरीय आइटम जोड़ना

आपको अपने घर में (फिर से, क्योंकि आप ऑटो-एड-रेफरेंस वूडू को आग नहीं देना चाहते हैं) में अपने मूल dll की प्रतिलिपि प्राप्त करने के लिए कुछ शक्तियां वूडू लिखना होगा।

यहाँ एक ps1 फ़ाइल है जो मैंने ..... तीसरे पक्ष के संदर्भ फ़ोल्डर में फ़ाइलें डालने के लिए लिखी है।

आपके लिए यह निर्धारित करने के लिए पर्याप्त है कि अपने मूल dll को किसी "घर" पर कैसे कॉपी करें ... खरोंच से शुरू होने के बिना।

फिर से, यह एक सीधा हिट नहीं है, लेकिन कुछ भी नहीं से बेहतर है।

param($installPath, $toolsPath, $package, $project)
if ($project -eq $null) {
$project = Get-Project
}

Write-Host "Start Init.ps1" 

<#
The unique identifier for the package. This is the package name that is shown when packages are listed using the Package Manager Console. These are also used when installing a package using the Install-Package command within the Package Manager Console. Package IDs may not contain any spaces or characters that are invalid in an URL.
#>
$separator = " "
$packageNameNoVersion = $package -split $separator | select -First 1

Write-Host "installPath:" "${installPath}"
Write-Host "toolsPath:" "${toolsPath}"
Write-Host "package:" "${package}"
<# Write-Host "project:" "${project}" #>
Write-Host "packageNameNoVersion:" "${packageNameNoVersion}"
Write-Host " "

<# Recursively look for a .sln file starting with the installPath #>
$parentFolder = (get-item $installPath)
do {
        $parentFolderFullName = $parentFolder.FullName

        $latest = Get-ChildItem -Path $parentFolderFullName -File -Filter *.sln | Select-Object -First 1
        if ($latest -ne $null) {
            $latestName = $latest.name
            Write-Host "${latestName}"
        }

        if ($latest -eq $null) {
            $parentFolder = $parentFolder.parent    
        }
}
while ($parentFolder -ne $null -and $latest -eq $null)
<# End recursive search for .sln file #>


if ( $parentFolder -ne $null -and $latest -ne $null )
{
    <# Create a base directory to store Solution-Level items #>
    $thirdPartyReferencesDirectory = $parentFolder.FullName + "\ThirdPartyReferences"

    if ((Test-Path -path $thirdPartyReferencesDirectory))
    {
        Write-Host "--This path already exists: $thirdPartyReferencesDirectory-------------------"
    }
    else
    {
        Write-Host "--Creating: $thirdPartyReferencesDirectory-------------------"
        New-Item -ItemType directory -Path $thirdPartyReferencesDirectory
    }

    <# Create a sub directory for only this package.  This allows a clean remove and recopy. #>
    $thirdPartyReferencesPackageDirectory = $thirdPartyReferencesDirectory + "\${packageNameNoVersion}"

    if ((Test-Path -path $thirdPartyReferencesPackageDirectory))
    {
        Write-Host "--Removing: $thirdPartyReferencesPackageDirectory-------------------"
        Remove-Item $thirdPartyReferencesPackageDirectory -Force -Recurse
    }

    if ((Test-Path -path $thirdPartyReferencesPackageDirectory))
    {
    }
    else
    {
        Write-Host "--Creating: $thirdPartyReferencesPackageDirectory-------------------"
        New-Item -ItemType directory -Path $thirdPartyReferencesPackageDirectory
    }

    Write-Host "--Copying all files for package : $packageNameNoVersion-------------------"
    Copy-Item $installPath\*.* $thirdPartyReferencesPackageDirectory -recurse
}
else
{
        Write-Host "A current or parent folder with a .sln file could not be located."
}


Write-Host "End Init.ps1" 

-2

रखो यह सामग्री फ़ोल्डर है

आदेश nuget pack [projfile].csprojयदि आप फ़ाइलों को सामग्री के रूप में चिह्नित करेंगे, तो यह स्वचालित रूप से आपके लिए करेगी।

फिर आइटम फ़ाइल को संपादित करें जैसा कि यहां बताया गया है कि आइटमग्रुप और नेटिवलिब और कोई भी तत्व नहीं है

<ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>

मेरे लिए काम किया

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