2011-10-14 9 views
36

मेरे पास एक बाइनरी का x86 और x64 संस्करण है जिसे मैं NuGet पर अपलोड करना चाहता हूं। उस पैकेज को बनाने/अपलोड करने के लिए सिफारिश या आवश्यक विधि क्या है? मैं अपने निर्णय के आधार पर find much नहीं कर सकता। मैं दो तरीकों ...मुझे 32-बिट और 64-बिट NuGet पैकेज को कैसे बनाना या अपलोड करना चाहिए?

  1. उन दोनों को अपलोड एक ही पैकेज
    • कौन सा मैं डिफ़ॉल्ट रूप से स्थापित करना चाहिए में देखते हैं?
    • क्या निर्णय लेने के लिए प्रोजेक्ट के प्रोसेसर आर्किटेक्चर का परीक्षण करने का कोई तरीका है?
  2. अपलोड दो अलग-अलग पैकेज

बोनस प्रश्न: क्या होगा यदि मैं Chocolatey की तरह कुछ है, जो पैकेज प्रबंधक अर्थ विज्ञान के साथ NuGet ऊपर लपेटता उपयोग कर रहा हूँ? मुझे अपने सिस्टम पर x86 और x64 संकुल स्थापित करने की आवश्यकता हो सकती है।

+3

आप इस समस्या को भी है के लिए हो, तो कृपया ऊपर वोट इस काम NuGet आइटम: http://nuget.codeplex.com/workitem/679 –

+0

क्या इस मुद्दे पर कोई अपडेट है? – Sjoerd222888

+0

मुझे प्रश्न और कम से कम, मेरा उत्तर अपडेट करने दें।क्योंकि मेरा मानना ​​है कि जब यह बहुत छोटा था और आप इस मुद्दे भी है हैं तो मजबूत 32- और 64-बिट सुविधाओं में बनाया –

उत्तर

11

हम discussingChocolatey Google Group पर एक समान मुद्दा रहा है। NuGet में निर्मित कोई अर्थशास्त्र नहीं है। आवश्यकता नहीं होगी, आप पर कौन सी प्रोसेसर आर्किटेक्चर चल रहे हैं। यह होना चाहिए जो प्रोसेसर आर्किटेक्चर आपका प्रोजेक्ट लक्ष्यीकरण है। और फिर यह चीजों को जटिल बनाता है ... आपको AnyCPU भी समझना होगा।

मुझे लगता है कि, मैं दो पैकेज अपलोड करने जा रहा हूं। जब मैं install.ps1 को ठीक करता हूं जो परियोजना लक्ष्य से पूछताछ कर सकता है तो मैं हमेशा एक संयुक्त प्रकाशित कर सकता हूं।

mypackage.x86 
mypackage.x64 
+1

नहीं था, मैं Chocolatey पैकेज के बारे में पूछ रहा था कृपया ऊपर वोट इस काम NuGet आइटम।: http://nuget.codeplex.com/workitem/679 –

+1

मैं दो संकुल, एक दर्द की तरह बनाने के लिए, मैं इस मुद्दे को एक समय पहले भी उठाया: http://nuget.codeplex.com/discussions/400682#post931990 – eschneider

0

32 या 64 बिट आर्किटेक्चर के लिए एक विशिष्ट लक्ष्य प्रतीत नहीं होता है। दर्द का बिट, लेकिन क्या आप आर्किटेक्चर का पता लगाने और तदनुसार स्थापित करने के लिए पावरहेल स्क्रिप्ट्स (install.ps1) के साथ कुछ कर सकते हैं?

पैकेज स्थापना और हटाने के दौरान PowerShell स्क्रिप्ट स्वचालित रूप से चल रहा है देखें - http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

13

आप सशर्त संदर्भों का उपयोग करके एक परियोजना में x64 और x86 समर्थन जोड़ सकते हैं। ऐसा लगता है कि अब के लिए Nuget एक ही नाम के साथ दो संदर्भ पसंद नहीं है। तो हमें मैन्युअल रूप से दूसरे संदर्भ में जोड़ने की आवश्यकता है और फिर संदर्भों को सशर्त बनाते हैं।

x64 नामक फ़ोल्डर में x64 & x86 असेंबली नामक फ़ोल्डर में x64 असेंबली सहेजें, उनके पास एक ही असेंबली नाम होना चाहिए। फिर जोड़ने के लिए सभी असेंबली के नामों के साथ अनुमत संदर्भ एरे अपडेट करें।

निम्न स्क्रिप्ट का उपयोग करें।

Install.ps1

$allowedReferences = @("Noesis.Javascript") 

# Full assembly name is required 
Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 

$projectCollection = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection 

$allProjects = $projectCollection.GetLoadedProjects($project.Object.Project.FullName).GetEnumerator(); 

if($allProjects.MoveNext()) 
{ 
    $currentProject = $allProjects.Current 

    foreach($Reference in $currentProject.GetItems('Reference') | ? {$allowedReferences -contains $_.Xml.Include }) 
    { 
     $hintPath = $Reference.GetMetadataValue("HintPath") 

     write-host "Matched againt $hintPath" 

     #If it is x64 specific add condition (Include 'Any Cpu' as x64) 
     if ($hintPath -match '.*\\(amd64|x64)\\.*\.dll$') 
     { 
      $Reference.Xml.Condition = "'TargetPlatform' != 'x86'" 

      $condition = $Reference.Xml.Condition 
      write-host "hintPath = $hintPath" 
      write-host "condition = $condition" 

      #Visual Studio doesnt allow the same reference twice (so try add friends) 
      $matchingReferences = $currentProject.GetItems('Reference') | ? {($_.Xml.Include -eq $Reference.Xml.Include) -and ($_.GetMetadataValue("HintPath") -match ".*\\(x86)\\.*\.dll$")} 

      if (($matchingReferences | Measure-Object).Count -eq 0) 
      { 
       $x86 = $hintPath -replace '(.*\\)(amd64|x64)(\\.*\.dll)$', '$1x86$3' 
       $x86Path = Join-Path $installPath $x86 

       if (Test-Path $x86Path) { 
        #Add 
        write-host "Adding reference to $x86" 

        $metaData = new-object "System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 
        $metaData.Add("HintPath", $x86) 
        $currentProject.AddItem('Reference', $Reference.Xml.Include, $metaData) 

        $newReference = $currentProject.GetItems('Reference') | ? {($_.Xml.Include -eq $Reference.Xml.Include) -and ($_.GetMetadataValue("HintPath") -eq $x86)} | Select-Object -First 1 

        $newReference.Xml.Condition = "'TargetPlatform' == 'x86'"   
       } 
      } 
     } 

     #If it is x86 specific add condition 
     if ($hintPath -match '.*\\x86\\.*\.dll$') 
     { 
      $Reference.Xml.Condition = "'TargetPlatform' == 'x86'" 

      $condition = $Reference.Xml.Condition 
      write-host "hintPath = $hintPath" 
      write-host "condition = $condition" 

      #Visual Studio doesnt allow the same reference twice (so try add friends) 
      $matchingReferences = $currentProject.GetItems('Reference') | ? {($_.Xml.Include -eq $Reference.Xml.Include) -and ($_.GetMetadataValue("HintPath") -match ".*\\(amd64|x64)\\.*\.dll$")} 

      if (($matchingReferences | Measure-Object).Count -eq 0) 
      { 
       $x64 = $hintPath -replace '(.*\\)(x86)(\\.*\.dll)$', '$1x64$3' 
       $x64Path = Join-Path $installPath $x64 

       if (Test-Path $x64Path) { 
        #Add 
        write-host "Adding reference to $x64" 

        $metaData = new-object "System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 
        $metaData.Add("HintPath", $x64) 
        $currentProject.AddItem('Reference', $Reference.Xml.Include, $metaData) 

        $newReference = $currentProject.GetItems('Reference') | ? {($_.Xml.Include -eq $Reference.Xml.Include) -and ($_.GetMetadataValue("HintPath") -eq $x64)} | Select-Object -First 1 

        $newReference.Xml.Condition = "'TargetPlatform' != 'x86'"   
       } else { 
        $amd64 = $hintPath -replace '(.*\\)(x86)(\\.*\.dll)$', '$1amd64$3' 
        $amd64Path = Join-Path $installPath $amd64 

        if (Test-Path $amd64Path) { 
         #Add 
         write-host "Adding reference to $amd64" 

         $metaData = new-object "System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 
         $metaData.Add("HintPath", $amd64) 
         $currentProject.AddItem('Reference', $Reference.Xml.Include, $metaData) 

         $newReference = $currentProject.GetItems('Reference') | ? {($_.Xml.Include -eq $Reference.Xml.Include) -and ($_.GetMetadataValue("HintPath") -eq $amd64)} | Select-Object -First 1 

         $newReference.Xml.Condition = "'TargetPlatform' != 'x86'"   
        }    
       }    
      }   
     } 
    } 
} 

Uninstall.ps1

$allowedReferences = @("Noesis.Javascript") 

# Full assembly name is required 
Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 

$projectCollection = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection 

$allProjects = $projectCollection.GetLoadedProjects($project.Object.Project.FullName).GetEnumerator(); 

if($allProjects.MoveNext()) 
{ 
    foreach($Reference in $allProjects.Current.GetItems('Reference') | ? {$allowedReferences -contains $_.UnevaluatedInclude }) 
    { 
     $allProjects.Current.RemoveItem($Reference) 
    } 
} 
+0

यह एक बड़ी मदद के लिए धन्यवाद किया गया था। – 0x1mason