windows - मुझे 32-बिट और 64-बिट नुगेट पैकेज कैसे बनाना या अपलोड करना चाहिए?




visual-studio nuget (2)

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

X64 और x86 असेंबली नामक फ़ोल्डर में x64 असेंबलियों को x86 नामक फ़ोल्डर में सहेजें। उनके पास एक ही विधानसभा का नाम होना चाहिए। फिर सभी विधानसभाओं के नामों के साथ अनुमत सरणी अपडेट करें।

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

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)
    }
}

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

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

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


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

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





chocolatey