Tengo un x86 y x64 versión de un archivo binario que quiero subir a NuGet. ¿Cuál es la recomendación o el método requerido para crear/cargar el paquete? Yo no puedo encontrará mucho a base de mi decisión. Veo dos métodos…

  1. Subir ambos en el mismo paquete
    • Cuál debo instalar por defecto?
    • Hay una manera de poner a prueba la arquitectura del procesador del proyecto para tomar la decisión?
  2. Subir dos paquetes separados

Pregunta extra: ¿Qué si estoy usando algo como Chocolate, que envuelve con el administrador de paquetes de NuGet semántica? Necesito/quiero x86 y x64 paquetes instalados en mi sistema.

  • Si usted tiene este problema, por favor hasta de votar este trabajo de NuGet elemento: nuget.codeplex.com/workitem/679
  • ¿Hay alguna novedad en este tema?
  • Me dejaba actualizar a la pregunta y, al menos, mi respuesta. Porque creo que me estaba preguntando acerca de los paquetes de Chocolate cuando era muy joven y no tenía el sólido de 32 – y 64-bit características incorporadas.

3 Comentarios

  1. 14

    Puede agregar x64 y x86 apoyo a un proyecto por el uso de condicionales referencias. Parece que por ahora Nuget no le gusta tener dos referencias con el mismo nombre. Así que tenemos que añadir en la segunda referencia de forma manual y, a continuación, hacer las referencias condicional.

    Guardar x64 ensamblados en una carpeta llamada x64 & x86 ensamblados en una carpeta llamada x86 ambas deben tener el mismo nombre de ensamblado. Luego de la actualización de la allowedReferences array con los nombres de todas las asambleas para agregar.

    El uso de las siguientes secuencias de comandos.

    Instalar.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'"           
                        }               
                    }               
                }           
            }
        }
    }
    

    Desinstalar.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)
        }
    }
    
    • Esta fue una gran ayuda, gracias.
  2. 12

    Hemos sido discutir de un problema similar en el Chocolate De Un Grupo De Google. No hay ninguna semántica construida en NuGet. El requisito de no ser, lo que la arquitectura del procesador que tienes en. Tendría que ser lo que la arquitectura del procesador es el proyecto de orientación. Y, a continuación, que complica las cosas… tendría que entender AnyCPU así.

    Yo creo que por ahora, voy a subir dos paquetes. Siempre puedo publicó un combinado de uno cuando puedo solucionar un install.ps1 que puede manejar consultar el proyecto de destino.

    mypackage.x86
    mypackage.x64
    

Dejar respuesta

Please enter your comment!
Please enter your name here