.net - मैं अपने प्रबंधित NuGet पैकेज समर्थन सी++/सीएलआई परियोजनाओं को कैसे बना सकता हूं?




dll c++-cli (4)

इंस्टॉलर सी # स्टार्टअप प्रोजेक्ट में खुद को संदर्भ जोड़ने का प्रयास करता है। स्थापित करने से पहले समाधान में स्टार्टअप प्रोजेक्ट को सी # प्रोजेक्ट बनाएं। यदि आपके पास कोई नहीं है तो एक डमी सी # प्रोजेक्ट बनाएं

मैंने एक NuGet पैकेज बनाया है जो इसे सी # प्रोजेक्ट से उपयोग करते समय अच्छी तरह से काम करता है। इसमें lib/net40 निर्देशिका में एक डीएलएल है, और डीएलएल संदर्भ के रूप में जोड़ा जाता है।

अब जब NuGet C ++ का समर्थन करता है, तो मैं वास्तव में अपने पैकेज को कैसे संशोधित करूं ताकि डीएलएल को सी ++ / सीएलआई प्रोजेक्ट में प्रबंधित संदर्भ के रूप में जोड़ा जा सके? मुझे यह समझाते हुए कोई ट्यूटोरियल नहीं मिल रहा है। अगर मैं पैकेज को बस जोड़ने की कोशिश करता हूं, तो मुझे निम्न त्रुटि मिलती है:

आप इस पैकेज को एक ऐसे प्रोजेक्ट में स्थापित करने का प्रयास कर रहे हैं जो 'मूल, संस्करण = v0.0' को लक्षित करता है, लेकिन पैकेज में उस ढांचे के साथ संगत किसी असेंबली संदर्भ या सामग्री फ़ाइलों को शामिल नहीं किया गया है।

कोई सोचता है कि समाधान फ़ाइलों को lib / मूल के अंतर्गत रखना है, लेकिन http://docs.nuget.org/docs/reference/support-for-native-projects अनुसार, यह समर्थित नहीं है। साथ ही, सीधे डीएलएल को lib के तहत डालने से कुछ भी नहीं लगता है।

जाहिर है, मुझे इसे .props या .targets फ़ाइल के साथ बिल्ड / मूल के तहत करना है, लेकिन मुझे यह काम करने के लिए उन फ़ाइलों में क्या लगाने की आवश्यकता है?


जैसा कि इस बंदरगाह के उत्तर में बताया गया है ( Nuget सी ++ / सीएलआई प्रोजेक्ट में इकाई फ्रेमवर्क स्थापित नहीं करेगा ), NuGet आपके लिए C ++ / CLI प्रोजेक्ट में परिवर्तन नहीं करेगा। हालांकि यह आपके लिए निर्भरता को डाउनलोड और अनपॅक करेगा। हम इसे अपनी निर्भरता के हिस्से के रूप में कमांड लाइन से उपयोग करते हैं। कमांड लाइन इस तरह कुछ दिखाई देगी:

/.NuGet/NuGet.exe
      Install 
      -NonInteractive 
      -ConfigFile $ENV{SRC_ROOT}/.nuget/NuGet.config 
      -OutputDirectory $ENV{SRC_ROOT}/packages 
      $ENV{SRC_ROOT}/packages.config

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


प्रमाण पत्र वास्तव में मशीनकी के साथ एन्क्रिप्ट किए जाते हैं जहां पैकेज स्रोत जोड़ा गया था। सादे टेक्स्ट संस्करण का उपयोग किए बिना, setApiKey कमांड को शायद निर्माण के हिस्से के रूप में चलाया जाना चाहिए।


वास्तव में "नियमित" NuGet संकुल को स्थापित करने और निम्न चरणों का उपयोग करके सी ++ / सीएलआई परियोजनाओं से स्वचालित रूप से संदर्भित करने की संभावना प्रतीत होती है (कम से कम NuGet >= 2.5 ):

  1. अपने प्रोजेक्ट में पैक किए जाने के build\<ProjectName>.targets फ़ाइल को build\<ProjectName>.targets (या संशोधित करें) और इसमें निम्न सामग्री डालें (सुनिश्चित करें कि <AssemblyName> वास्तविक मूल्य के साथ प्रतिस्थापित करें):

    <?xml version="1.0" encoding="utf-8" ?>
    <Project ToolsVersion="4.0"
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- for C++/CLI projects only -->
      <ItemGroup Condition="'$(Language)' == 'C++'">
        <Reference Include="<AssemblyName>">
          <!--
            this .targets file is installed next to the assembly,
            so we do not have to figure out any versions or paths here ourselves
          -->
          <HintPath>
            $(MSBuildThisFileDirectory)..\lib\native\<AssemblyName>.dll
          </HintPath>
        </Reference>
      </ItemGroup>
    </Project>
    
  2. पैक किए गए प्रोजेक्ट के .nuspec में एक या अधिक file प्रविष्टियों को जोड़ने के लिए लक्ष्य मशीन पर lib\native\ निर्देशिका में असेंबली को भी शामिल करें:

    <package>
      <metadata>
        ...
      </metadata>
      <files>
        ...
        <!--
          add a copy of the assembly to lib\native to prevent NuGet
          from complaining about incompatible native projects
        -->
        <file src="bin\$configuration$\$id$.dll" target="lib\native\" />
        <file src="bin\$configuration$\$id$.xml" target="lib\native\" />
    
        <!-- don't forget about the .targets file containing the reference -->
        <file src="build\$id$.targets" target="build\" />
      </files>
      ...
    </package>
    

यहां तक ​​कि यदि NuGet C ++ / CLI प्रोजेक्ट्स में असेंबली संदर्भ नहीं जोड़ता है, तब भी यह किसी पैकेज द्वारा प्रदान की गई किसी भी .props और .targets फ़ाइलों को सम्मिलित करता है। और चरण 1 से कस्टम लक्ष्य हमारी पैक की गई असेंबली का संदर्भ जोड़ देगा।

जहां तक ​​मैं इसे देख सकता था, इस समाधान का एक दोष यह है कि इस तरह से जोड़ा गया संदर्भ Commpon Properties/Framework and References सी ++ / सीएलआई प्रोजेक्ट के Commpon Properties/Framework and References अनुभाग में प्रदर्शित नहीं होता है। अन्य भी हो सकते हैं, इसलिए इसे अपने जोखिम पर उपयोग करें ...





nuget-package