2017-04-06 4 views
5

पर कॉपी नहीं किए गए मुझे एक कस्टम Nuget पैकेज के साथ कोई समस्या मिली है। चलिए इसे MyCompany.Library.nupkg कहते हैं। यह एक कॉर्पोरेट आर्टिफैक्टरी Nuget रेपो पर होस्ट किया जाता है। यह पैकेज Newtonsoft.Json पर निर्भर करता है। किसी कारण से आश्रित डीएलएल को मेरे प्रोजेक्ट के आउटपुट फ़ोल्डर में कॉपी नहीं किया गया है, अगर मैं उस परियोजना का संदर्भ देता हूं जो उस Nuget पैकेज का उपयोग करता है। अजीब चीज यह है कि जब मैं एक और पैकेज का उपयोग करता हूं (उदा। एमक, मेरे बजाय) निर्भर डीएलएल की प्रतिलिपि बनाई जाती है।एक NuGet पैकेज के निर्भर डीएलएल आउटपुट फ़ोल्डर

मैं परीक्षण समाधान बना लिया है इस मुद्दे को पुन: पेश करने:

समाधान ReferenceTest:

  • परियोजना: SomeLib.dll; संदर्भ:
    • MyCompany.Library Nupkg (, Newtonsoft.Json पर निर्भर करता है इसलिए वह भी जोड़ दिया जाता है)
    • Moq Nupkg (Castle.Core पर निर्भर करता है, भी जोड़ा)
  • परियोजना: MyWinFormsApp.exe; परियोजना संदर्भ:
    • SomeLib.csproj

जब मैं SomeLib के आउटपुट फ़ोल्डर को देखो, मैं देख रहा हूँ:

  • SomeLib.dll
  • Moq.dll
  • Castle.Core.dll
  • MyCompany.Library.dll
  • Newtonsoft.Json.dll

यह अच्छा लग रहा है।

लेकिन जब मैं MyWinFormsApp के आउटपुट फ़ोल्डर को देखता हूं, तो Newtonsoft.Json.dll गुम है और एप्लिकेशन चलाते समय, यह अपवाद फेंकता है कि न्यूटॉन्सॉफ्ट.जेसन डीएल नहीं मिला है। हालांकि, Castle.Core.dll MyWinFormsApp के आउटपुट फ़ोल्डर में है।

मैंने Moq और MyCompany के nuspecs की तुलना की है। लाइब्रेरी और मुझे वास्तव में कोई महत्वपूर्ण अंतर नहीं मिल सकता है।

मैं उन सभी परियोजनाओं को बदल सकता हूं जो मेरे कुछ लिब का उपयोग न्यूटॉन्सॉफ्ट.जेसन को संदर्भित करने के लिए करते हैं, लेकिन यह बहुत सारी परियोजनाएं हैं और मैं इसके साथ अन्य डेवलपर्स को परेशान नहीं करना चाहता हूं। उन्हें यह नहीं पता होना चाहिए कि कुछ लिब उस असेंबली का उपयोग करता है।

SomeLib.csproj में संदर्भ इस तरह हैं:

<ItemGroup> 
    <Reference Include="MyCompany.Library, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> 
     <HintPath>..\packages\MyCompany.Library.1.0.0\lib\net461\MyCompany.Library.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    <Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> 
     <HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    <Reference Include="Moq, Version=4.5.28.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> 
     <HintPath>..\packages\Moq.4.5.28\lib\net45\Moq.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> 
     <HintPath>..\packages\Newtonsoft.Json.8.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="System.Xml.Linq" /> 
    <Reference Include="System.Data.DataSetExtensions" /> 
    <Reference Include="Microsoft.CSharp" /> 
    <Reference Include="System.Data" /> 
    <Reference Include="System.Net.Http" /> 
    <Reference Include="System.Xml" /> 
    </ItemGroup> 

मेरे Nuspec इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?> 
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 
    <metadata> 
    <id>MyCompany.Library</id> 
    <version>0.0.0</version> 
    <description>MyCompany Core library</description> 
    <authors>MyCompany</authors> 
    <references> 
     <reference file="MyCompany.Library.dll" /> 
    </references> 
    <dependencies> 
     <dependency id="Newtonsoft.Json" version="[8.0,9.0.1]" /> 
    </dependencies>  
    </metadata> 
    <files> 
    <file src="MyCompany.Library\bin\Release\MyCompany.Library.dll" target="lib\net461"/> 
    <file src="MyCompany.Library\bin\Release\MyCompany.Library.pdb" target="lib\net461"/> 
    <file src="MyCompany.Library\bin\Release\MyCompany.Library.xml" target="lib\net461"/> 
    </files> 
</package> 

मैं दृश्य स्टूडियो 2015 व्यावसायिक उपयोग कर रहा हूँ।

मेरे सवालों का:

  1. क्यों दृश्य स्टूडियो मेरी निर्भर dll की नकल नहीं कर रहा है?
  2. यह मोक की निर्भरताओं की प्रतिलिपि क्यों बना रहा है? क्या फर्क पड़ता है?

किसी भी मदद के लिए धन्यवाद।

Quido

संपादित

मैं Moq की NUSPEC और अपने पैकेज और (पूरी तरह से हताश) की तुलना कर रहा है मैं एक diffence पाया। Moq Nuspec शामिल हैं:

<dependencies> 
    <group targetFramework=".NETFramework4.5"> 
    <dependency id="Castle.Core" version="3.3.3" /> 
    </group> 
</dependencies> 

और अपने ही पैकेज में शामिल हैं:

<dependencies> 
    <dependency id="Newtonsoft.Json" version="[8.0,9.0.1]" /> 
</dependencies>  

मैं एक targetFramework निर्दिष्ट करने के लिए मेरी निर्भरता बदल गया है और अब VisualStudio मेरी निर्भरता कॉपी करता है!

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

तो: समस्या हल हो, लेकिन मुझे पता नहीं क्यों ...

+0

मुझे इस विषय पर एक और प्रश्न मिला है। http://stackoverflow.com/questions/1132243/msbuild-doesnt-copy-references-dll-files-if-using-project- निर्भरता-in-sol यह वीएस/एमएसबिल्ड में एक बग की तरह दिखता है। उस विषय पर स्वीकृत उत्तर यह बहुत अच्छी तरह से बताता है। – Quido

उत्तर

0

सही परियोजना का चयन करें और गुण में "Newtonsoft.json" संदर्भ पर क्लिक किया है। संपत्ति पृष्ठ में जांचें कि "स्थानीय कॉपी करें" संपत्ति "True" पर सेट है या नहीं।

+1

कुछ Lib.csproj में, कॉपी स्थानीय सत्य पर सेट है। यही कारण है कि यह उस परियोजना के आउटपुट फ़ोल्डर में कॉपी किया गया है। MyWinFormsApp प्रोजेक्ट में उस DLL का संदर्भ नहीं है, इसलिए मैं कॉपी स्थानीय सेट नहीं कर सकता। – Quido

0

1. विजुअल स्टूडियो मेरे आश्रित डीएल की प्रतिलिपि क्यों नहीं बना रहा है?

जैसा कि आप टिप्पणी करते हैं, एमएसबिल्ड परियोजना में परियोजना निर्भरताओं का उपयोग करते समय संदर्भों की प्रतिलिपि नहीं करता है (डीएलएल फाइलें) परियोजना में कुछ प्रदूषण परियोजना से संदर्भ प्रदूषण से बचने के लिए। तो संदर्भित परियोजना के संदर्भ आउटपुट फ़ोल्डर में प्रतिलिपि नहीं होंगे।

2. यह मोक की निर्भरताओं की प्रतिलिपि क्यों बना रहा है? क्या फर्क पड़ता है?

पहले प्रश्न में उत्तर के रूप में, Moq की निर्भरताओं को MyWinFormsApp के आउटपुट फ़ोल्डर में कॉपी नहीं करना चाहिए। तो आपको यह जांचने की ज़रूरत है कि आपने MyWinFormsApp प्रोजेक्ट में Moq पैकेज स्थापित किया है या आप MyWinFormsApp के संदर्भों को देख सकते हैं, सुनिश्चित करें कि आपके पास केवल कुछLib प्रोजेक्ट का प्रोजेक्ट संदर्भ है।

उम्मीद है कि यह आपकी मदद कर सकता है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। जिसे आप "संदर्भ प्रदूषण" कहते हैं, मेरी राय में "संतोषजनक निर्भरता" है। उस समाधान के लिए बस उस असेंबली की आवश्यकता होती है। यह इसके बिना शुरू नहीं होगा। और मुझे पूरा यकीन है कि मैंने MyWinFormsApp में Moq का संदर्भ नहीं जोड़ा है। कुछ और अंतर्दृष्टि के लिए मूल पोस्ट में मेरा संपादन देखें ... – Quido

+0

सुनिश्चित नहीं है कि आपने परीक्षण समाधान कैसे बनाया है। क्या आपने कभी SomeLib प्रोजेक्ट को पैक किया है, फिर इसे MyWinFormsApp प्रोजेक्ट में इंस्टॉल करें?या सिर्फ परियोजना संदर्भ? मेरे पुन: उत्पन्न चरण हैं: कुछलिब प्रोजेक्ट बनाएं-> Moq nuget पैकेज जोड़ें-> कंसोल बनाएं प्रोजेक्ट MyWinFormsApp-> MyLinFormsApp प्रोजेक्ट (कुछLib प्रोजेक्ट पैक न करें) के प्रोजेक्ट संदर्भ के रूप में SomeLib प्रोजेक्ट जोड़ें -> MyWinFormsApp प्रोजेक्ट बनाएं। तुम्हारे साथ कोई अलग? –

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