2016-02-03 13 views
8

पर x86 और x64 लाइब्रेरी जोड़ना मैंने एक लाइब्रेरी बनाई है जो सीईएफशर्प पर निर्भर करता है जिसके लिए विशिष्ट प्लेटफ़ॉर्म के लिए लाइब्रेरी बनाने की आवश्यकता होती है। तो कोई भी एसीसीपीयू समर्थन नहीं।NuGet पैकेज

अब मैं इसे एक NuGet में पैक करना चाहता हूं। जहां तक ​​मैं समझता हूं कि आपको इन फ़ाइलों को बिल्ड फ़ोल्डर में रखना है और .targets फ़ाइल है जो संदर्भ के लिए सही डीएल चुनती है। तो मैं एक NuGet पैकेज इस तरह लग रही के साथ समाप्त हो गया: अब तक

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="PlatformCheck" BeforeTargets="InjectReference" 
    Condition="(('$(Platform)' != 'x86') AND ('$(Platform)' != 'x64'))"> 
    <Error Text="$(MSBuildThisFileName) does not work correctly on '$(Platform)' platform. You need to specify platform (x86 or x64)." /> 
    </Target> 

    <Target Name="InjectReference" BeforeTargets="ResolveAssemblyReferences"> 
    <ItemGroup Condition="'$(Platform)' == 'x86' or '$(Platform)' == 'x64'"> 
     <Reference Include="MyLib"> 
     <HintPath>$(MSBuildThisFileDirectory)$(Platform)\MyLib.dll</HintPath> 
     </Reference> 
    </ItemGroup> 
    </Target> 
</Project> 

तो अच्छा:

lib 
    monodroid 
     MyLib.dll 
    xamarin.ios10 
     MyLib.dll 
    net45 
     MyLib.dll (x86) 
build 
    net45 
     x86 
      MyLib.dll (x86) 
     x64 
      MyLib.dll (x64) 
     MyLib.targets 

मैं .targets फ़ाइल के निम्नलिखित के अंदर डाल दिया। अब समस्या के लिए।

<Reference Include="MyLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d64412599724c860, processorArchitecture=x86"> 
    <HintPath>..\packages\MyLib.0.0.1\lib\net45\MyLib.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

हालांकि मैं .targets फाइल के बारे में उल्लेख किया कुछ भी नहीं दिख रहा है: जब एक नया WPF परियोजना को यह NuGet जोड़ने, मैं पुस्तकालय के लिए संदर्भ की तरह .csproj फ़ाइल में प्रदर्शित होने को देखते हैं। क्या यह अभी भी NuGet 3 के साथ ऐसा करने का तरीका है? क्या मैंने कुछ गलत किया? X86 lib के संदर्भ के कारण x64 चलते समय वर्तमान में यह रनटाइम पर विफल रहता है।

+0

यदि आपको प्रोजेक्ट.जेसन का उपयोग करने वाली नई विंडोज 10 परियोजनाओं का समर्थन करने की आवश्यकता नहीं है, तो मैं lib \ Net45 निर्देशिका को हटाने का प्रयास करूंगा। NuGet को एक WPF प्रोजेक्ट में स्थापित करना चाहिए और प्रोजेक्ट फ़ाइल (.csproj) में .targets फ़ाइल आयात करें। –

+0

मैं यूडब्ल्यूपी या किसी भी नई परियोजनाओं का समर्थन करने की योजना नहीं बना रहा जो नई परियोजना.जेसन सामग्री का उपयोग करता है। कल फिर से प्रयास करेंगे। हालांकि, अभी भी परेशान नहीं है कि csproj फ़ाइल में संदर्भित लक्ष्यों को न देखे जहां nuget जोड़ा गया था। – Cheesebaron

+0

मैंने lib \ net45 फ़ोल्डर को हटाने का प्रयास किया, जिसने इसे बनाने के अलावा कुछ भी नहीं किया क्योंकि यह डीएल नहीं मिला। – Cheesebaron

उत्तर

11

इस तरह से लंबे समय तक इस तरह से झुकाव के बाद मैंने इसे समझ लिया।

स्पष्ट रूप से build.prop और build.target फ़ाइलों को NuGet पैकेज के समान नाम होने की आवश्यकता है, अन्यथा इसे csproj फ़ाइल में नहीं जोड़ा जाएगा।

संपादित करें:

मैं एक small github repository बनाया है कैसे अपनी परियोजना के लिए इस का उपयोग करने के दिखा।

यह 3 परियोजनाओं के साथ एक समाधान प्रदर्शित करता है, एक एंड्रॉइड के लिए आईओएस और नेट 45 जो x86 और x64 दोनों को लक्षित करता है।

नोटिस, .props फ़ाइल में। पथ अनपॅक किए गए NuGet की फ़ोल्डर संरचना पर इंगित कर रहे हैं। तो ये पथ आपके nuspec फ़ाइल में जो आपने डाले हैं उसे मैप करें।

<?xml version="1.0"?> 
<package> 
    <metadata> 
    <id>My.Awesome.Library</id> 
    <version>1.0.0</version> 
    <title>My Awesome Library</title> 
    <description>Herpa Derpa</description> 
    </metadata> 
    <files> 
    <file src="My.Awesome.Library.Droid\bin\Release\My.Awesome.Library.*" 
     target="lib\monodroid70" /> 

    <file src="My.Awesome.Library.iOS\bin\Release\My.Awesome.Library.*" 
     target="lib\xamarin.ios10" /> 

    <file src="My.Awesome.Library.Net45\bin\x64\Release\My.Awesome.Library.*" 
     target="build\x64" /> 

    <file src="My.Awesome.Library.Net45\bin\x86\Release\My.Awesome.Library.*" 
     target="build\x86" /> 
    <file src="My.Awesome.Library.Net45\bin\x86\Release\My.Awesome.Library.*" 
     target="lib\net45" /> 

    <file src="My.Awesome.Library.props" target="build\net45" /> 
    </files> 
</package> 

मैं build\x64 में build\x86 और 64 फाइलों में मेरी 86 फ़ाइलें डाल:

तो रेपो के रूप में, आप की तरह एक nuspec परिभाषित करते हैं। इन फ़ाइलों के लिए, फ़ोल्डर निर्माण का नाम अनिवार्य रूप से इस मामले में कुछ भी हो सकता है। यहां क्या मायने रखता है कि संबंधित प्लेटफ़ॉर्म के लिए इन फ़ोल्डरों पर बिंदुओं के नीचे प्रोप फ़ाइल है।

मैं lib\net45 भी मामलों में 86 lib डाल कि क्या यकीन नहीं है। आप इसके साथ प्रयोग कर सकते हैं। प्रोप फ़ाइल को वैसे भी आपके लिए सही चुनना चाहिए।

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <Reference Include="My.Awesome.Library" Condition="'$(Platform)' == 'x86'"> 
     <HintPath>$(MSBuildThisFileDirectory)..\x86\My.Awesome.Library.dll</HintPath> 
    </Reference> 
    <Reference Include="My.Awesome.Library" Condition="'$(Platform)' == 'x64'"> 
     <HintPath>$(MSBuildThisFileDirectory)..\x64\My.Awesome.Library.dll</HintPath> 
    </Reference> 
    </ItemGroup> 
</Project> 

इस मामले $(MSBuildThisFileDirectory) में build\net45\ फ़ोल्डर हो, सुनिश्चित करें कि आपके पथ सही ढंग से dll के पर अंक होगा। build\net45 फ़ोल्डर यहां महत्वपूर्ण है। इस प्रकार NuGet स्वचालित रूप से लक्ष्य आयात करता है और फ़ाइलों को प्रोप करता है।

यह भी ध्यान दें कि नाम My.Awesome.Library बहुत ही सुसंगत है। यहां महत्वपूर्ण बात यह है कि आपकी प्रोप फ़ाइल का नाम NuGet पैकेज आईडी से मेल खाता है। अन्यथा ऐसा लगता है जैसे NuGet इसे आयात नहीं करेगा।

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