2011-10-14 14 views
36

Tengo una versión x86 y x64 de un archivo binario que deseo cargar en NuGet. ¿Cuál es la recomendación o el método requerido para crear/cargar ese paquete? No puedo find much para basar mi decisión. Veo dos métodos ...¿Cómo debo crear o cargar un paquete NuGet de 32 y 64 bits?

  1. Sube a ambos en el mismo paquete
    • , cual debe instalar por defecto?
    • ¿Hay alguna forma de probar la arquitectura del procesador del proyecto para tomar una decisión?
  2. Subir dos paquetes separados

Bono pregunta: ¿Qué pasa si estoy usando algo como Chocolatey, que concluye con la semántica NuGet gestor de paquetes? Es posible que necesite/desee los paquetes x86 y x64 instalados en mi sistema.

+3

Si le sucede que tiene este problema también, por favor a voto este trabajo elemento NuGet: http://nuget.codeplex.com/workitem/679 –

+0

¿Hay alguna actualización sobre este problema? – Sjoerd222888

+0

Déjeme actualizar la pregunta y, al menos, mi respuesta.Porque creo que estaba preguntando sobre los paquetes de Chocolatey cuando era muy joven y no tenía las sólidas funciones de 32 y 64 bits integradas. –

Respuesta

11

Hemos estado discussing un problema similar en el Chocolatey Google Group. No hay ninguna semántica integrada en NuGet. El requisito no sería, , qué arquitectura de procesador está ejecutando en. Tendría que ser a qué arquitectura de procesador se dirige su proyecto. Y luego eso complica las cosas ... tendrías que entender AnyCPU también.

Creo que por ahora, voy a subir dos paquetes. Siempre puedo publicar uno combinado cuando arreglo un install.ps1 que puede manejar la consulta del objetivo del proyecto.

mypackage.x86 
mypackage.x64 
+1

Si tiene este problema también, vote por favor este artículo de NuGet: http://nuget.codeplex.com/workitem/679 –

+1

Hago dos paquetes, como una especie de problema. Hace un tiempo me planteé este problema también: http://nuget.codeplex.com/discussions/400682#post931990 – eschneider

0

No parece haber un objetivo específico para las arquitecturas de 32 o 64 bits. Es un poco molesto, pero ¿puedes hacer algo con los scripts de powershell (install.ps1) para detectar la arquitectura e instalarla en consecuencia?

Ver Ejecución automática de scripts de PowerShell durante la instalación y eliminación de paquetes - http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

13

Puede agregar soporte x64 y x86 a un proyecto mediante el uso de referencias condicionales. Parece que por ahora a Nuget no le gusta tener dos referencias con el mismo nombre. Entonces, necesitamos agregar la segunda referencia manualmente y luego hacer las referencias condicionales.

Guarde los ensamblados x64 en una carpeta llamada x64 & x86 ensambles en una carpeta llamada x86. Ambos deben tener el mismo nombre de ensamblaje. Luego actualice la matriz allowedReferences con los nombres de todos los ensambles para agregar.

Utilice los siguientes scripts.

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

This fue una gran ayuda, gracias. – 0x1mason

Cuestiones relacionadas