संदर्भित निर्भरता सहित स्वचालित रूप से NuGet पैकेज बनाएँ


83

मैं एक स्थानीय / आंतरिक नुगेट रिपॉजिटरी चलाना चाहता हूं । मुझे लगता है कि मुझे पता चल गया है कि मौजूदा नूगेट पैकेज को "पुन: उपयोग" कैसे किया जाता है, जिसमें नूगेट का उपयोग करके डमी प्रोजेक्ट में शामिल किया गया है और मेरी स्थानीय रूप से कैश्ड .nupkgफ़ाइलों को हथियाने के लिए पैकेज फ़ाइल को स्कैन किया जा रहा है , लेकिन ...

आप .nupkgएक परियोजना से एक नौगेट पैकेज ( ) कैसे बनाते हैं , स्वचालित रूप से सभी dll निर्भरता सहित और न केवल उन के माध्यम से NuGet को पकड़ा जाता है?

विशेष रूप से:

  1. एक समाधान बनाएँ
  2. एक नया प्रोजेक्ट जोड़ें
  3. विभिन्न .dllफाइलों / अन्य परियोजनाओं के संदर्भ जोड़ें <- यह लापता हिस्सा है
  4. पैकेज मैनेजर / cmdline / जो भी हो के माध्यम से NuGet पैकेज जोड़ें
  5. कुछ स्वचालित रूप से बनाता है.nupkg

मैंने जो कुछ पाया है, उससे आप ऐसा करना चाहते हैं

  • निर्भरता को शामिल करने के .csprojलिए अपनी फ़ाइल को मैन्युअल रूप से संपादित करें<BuildPackage>true</BuildPackage>
  • मैन्युअल रूप से एक .nuspecफ़ाइल बनाएं और मैन्युअल रूप से अपनी निर्भरताएं सूचीबद्ध करें ( समान? )
  • nuget packअपनी .nuspecफ़ाइल पर मैन्युअल रूप से चलाएं

लेकिन सब कुछ मैनुअल है, जो बेवकूफ है। यहां तक ​​कि अर्ध-स्वचालित समाधान अभी भी अजीब या आधे-मैनुअल हैं:

मैं उस चीज़ के लिए व्यवस्थित हो जाऊंगा जो स्वचालित .nuspecरूप से प्रोजेक्ट संदर्भों से प्रकट होती है। फिर सैद्धांतिक रूप से उस + nuget बिल्ड-इवेंट को बिल्ड-प्रोजेक्ट / nuget पैकेज में रोल किया जा सकता है, जिसे मैं वास्तव में देखना चाहता हूं।


मैं तो बस इस वी.एस. विस्तार में आए eyecatch.no/projects/nuget-package-template जो मैं इस पर गौर करने की आवश्यकता होगी ...
drzaus

3
पांच साल बाद और nxet 4.x कल्पना या पैक अभी भी निर्भरता निर्धारित नहीं कर सकता है।
स्टिंगजैक

क्या इस मुद्दे के लिए कोई अद्यतन है? या क्या आपको अभी भी ये समस्याएं हैं?
डोमिनिक जोनास

मैं इस पर थोड़ी देर पहले छोड़ दिया, लेकिन इस उत्तर के
drzaus

यह समस्या अभी भी मौजूद है। :(
BrainSlugs83

जवाबों:


75

आपकी बात # 3 ( विभिन्न। Dll फ़ाइलों / अन्य परियोजनाओं के संदर्भ जोड़ें - - यह गायब हिस्सा है ) वास्तव में दो अलग-अलग मुद्दे हैं: (1) विभिन्न dll फ़ाइलों के संदर्भ जोड़ें, और (2) अन्य परियोजनाओं में संदर्भ जोड़ें वही समाधान।

यहां नंबर (2) को नुगेट 2.5 के रूप में कुछ अतिरिक्त समर्थन मिला है । किसी प्रोजेक्ट के लिए NuGet पैकेज बनाते समय आप उसी समाधान में अन्य परियोजनाओं के संदर्भों को शामिल करने का विकल्प जोड़ सकते हैं:

nuget pack projectfile.csproj -IncludeReferencedProjects

यदि projectfile.csprojआपके समाधान में किसी भी अन्य परियोजनाओं को संदर्भित करता है जो कि NuGet संकुल के रूप में भी सामने आता है, तो इन परियोजनाओं के NuGet संकुल को निर्भरता के रूप में जोड़ा जाएगा। यदि यह आपके समाधान में उन परियोजनाओं को संदर्भित करता है जो खुद को NuGet पैकेज के रूप में उजागर नहीं करते हैं, तो उनके dll को इस NuGet पैकेज में शामिल किया जाएगा।

(1) के रूप में, यदि आप अपने आप को अक्सर अपनी परियोजनाओं में dlls जोड़ते हैं जो NuGet पैकेज के रूप में उपलब्ध नहीं हैं, तो आप इन फ़ाइलों के साथ सिर्फ अपना (आंतरिक) NuGet पैकेज बना सकते हैं। यदि आप इन फ़ाइलों को सीधे फ़ाइलों के बजाय NuGet पैकेज के रूप में जोड़ते हैं, तो यह NuGet पैकेज आपके प्रोजेक्ट के NuGet पैकेज में निर्भरता होगी।


3
sigh # 1 अभी भी मेरे स्वाद के लिए बहुत मैनुअल है। वास्तव में, "इन फाइलों के साथ अपना खुद का (आंतरिक) NuGet पैकेज बनाएं" जो मैं करने की कोशिश कर रहा हूं - इस सवाल का पूरा मुद्दा यह है कि मैं गैर-NuGet .dll को स्वचालित रूप से एक NuGet पैकेज में रोल करना चाहता हूं। नहीं के माध्यम से जाओ और प्रत्येक dll को मैन्युअल रूप से सूचीबद्ध करें एक .nuspec, जो मुझे लगता है कि आप क्या सुझाव दे रहे हैं?
drzaus

आपको प्रत्येक DLL को अलग से निर्दिष्ट करने की आवश्यकता नहीं है। यदि आप उनमें से कई हैं तो यह वास्तव में बहुत काम आएगा । शामिल करने के लिए फ़ाइलों को सूचीबद्ध करते समय, आप (पुनरावर्ती) वाइल्डकार्ड ( docs.nuget.org/docs/reference/… ) का उपयोग कर सकते हैं , इसलिए यदि आप उदाहरण के लिए इन सभी DLL को एक अलग फ़ोल्डर में रखते हैं, तो यह शामिल करने के लिए एक-लाइनर होगा मॉल।
जूलियन

आह, अब मुझे लगता है कि आप कहाँ जा रहे हैं - इसलिए अगर मैं एक रैपर परियोजना बनाऊं, तो सामान्य "राइट-क्लिक प्रोजेक्ट> संदर्भ जोड़ें" के माध्यम से संदर्भ शामिल करें, फिर मैं इसे निर्देशिका nuspecमें सब कुछ शामिल कर सकता हूं bin(मेरे संदर्भ मानकर) सभी "कॉपी लोकल" हैं), मैंने जो कुछ भी जोड़ा है, वह अपने आप उठ जाएगा। थोड़ा बाधित लगता है, लेकिन शायद काम करेगा।
13:30

6
यह स्वचालित रूप से आपके बिन निर्देशिका में जो कुछ भी है उसे नहीं उठाएगा, आपको इसे स्पष्ट रूप से निर्दिष्ट करना होगा, कुछ इस तरह से:<file src="bin\release\*.dll" target="lib" />
जूलियन

2
ध्यान दें, यदि संदर्भित की जा रही परियोजनाओं में एक nuspec फ़ाइल होती है, तो nuget एक पैकेज के रूप में व्यवहार करेगी और उसे लिबर फ़ोल्डर में शामिल नहीं करेगी, लेकिन इसे पैकेज निर्भरता में जोड़ देगी
वर्कबाइट

5

अन्य Googler के लिए, यदि आप NuGet.targets फ़ाइल का उपयोग कर रहे हैं, तो आप इसका उपयोग NuGet Pack चलाने के लिए कर सकते हैं:

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>

7
होनहार लगता है, लेकिन वास्तव में लागू करने के लिए पर्याप्त जानकारी नहीं है। यह NuGet.targets फ़ाइल क्या है जो आप बोलते हैं? मैं सामान्य रूप से बिल्ड फ़ाइलों के साथ परिचित हूं, लेकिन यह विशिष्ट उपयोग का मामला नहीं है
bikeman868

2

इसकी जांच करें!

जो समाधान मुझे मिला वह विज़ुअल स्टूडियो के लिए एक एक्सटेंशन है: https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96-view/Reviews

आप केवल Nuget Package NuGet Package नामक नई परियोजना जोड़ते हैं

फिर आप संदर्भों और BOOOM के लिए दिलचस्प परियोजनाओं को जोड़ रहे हैं !! सभी निर्भरताएँ और फ़ाइल निर्देशिकाएँ स्वचालित रूप से जुड़ जाती हैं। यदि आप NuSpec डेटा को संशोधित करना चाहते हैं, तो आप प्रोजेक्ट पर राइट क्लिक करते हैं और प्रॉपर्टीज पर जाते हैं, फिर आप जो चाहते हैं उसे संशोधित करें। उत्पन्न NuSpec और nupkg आपके नए प्रोजेक्ट के फ़ोल्डर obj में होगा । मुझे उम्मीद है यह मदद करेगा ;)।


1
क्या VS2017 का भी कोई हल है?
डोमिनिक जोनास

बिल्ड सर्वर पर पैकेज बनाने के मामले में यह काम नहीं करता है।
मिकि -2142

बहुत बुरा यह पदावनत है। उपयोगी होता।
जोएलक

2

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

मैंने यहाँ पाए जाने वाले समाधान का परीक्षण किया है: https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-use-dotnet-pack-2d8p

और NuGet पैकेज एक्सप्लोरर का उपयोग करके NuGet पैकेज की जांच करने के बाद, संदर्भित परियोजनाओं द्वारा उत्पादित DLL वास्तव में मौजूद हैं। मैं वास्तव में इस पैकेज को NuGet को सबमिट करके परीक्षण कर रहा हूं और इसका परीक्षण कर रहा हूं।

यहाँ मेरे स्रोत के मामले में यह आपके लिए उपयोगी है: https://github.com/jchristn/NuGetPackTest

और परीक्षण NuGet पैकेज: https://www.nuget.org/packages/NuGetPackTest/1.0.0

समाधान अच्छी तरह से काम करता है। मुझे नहीं पता कि यह कैसा लगने वाला है जब संदर्भों की परतें हैं, मुझे यकीन है कि यह वास्तव में बालों और वास्तव में तेज़ हो सकता है।

यहाँ छवि विवरण दर्ज करें

NuGetPackTest लाइब्रेरी से .csproj जो परियोजना TestLibrary (भाग के लिए हटाए गए अंश) का संदर्भ देता है

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>

1
इससे मेरी समस्या सीधे हल हो गई। मैंने निर्देश का अनुसरण किया जैसा कि लिंक में बताया गया है और इसने काम किया है। आपके उत्तर में अच्छी तरह से जोड़ने के लिए अच्छा है।
याबेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.