windows - studio - nuget microsoft
¿Cómo debo crear o subir un paquete NuGet de 32 y 64 bits? (3)
Hemos estado discussing un problema similar en el Chocolatey Google Group . No hay ninguna semántica integrada en NuGet. El requisito no sería, en qué arquitectura de procesador se está ejecutando . Tendría que ser a qué arquitectura de procesador se dirige su proyecto. Y luego eso complica las cosas ... también tendrías que entender AnyCPU
.
Creo que por ahora, 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
Tengo una versión x86 y x64 de un archivo binario que quiero subir a NuGet. ¿Cuál es la recomendación o el método requerido para crear / cargar ese paquete? No puedo encontrar mucho en lo que basar mi decisión. Veo dos métodos ...
- Suba los dos en el mismo paquete
- ¿Cuál debería instalar por defecto?
- ¿Hay alguna manera de probar la arquitectura del procesador del proyecto para tomar una decisión?
- Sube dos paquetes por separado
Pregunta adicional: ¿Qué sucede si uso algo como Chocolatey , que envuelve NuGet con la semántica del administrador de paquetes? Es posible que necesite / desee los paquetes x86 y x64 instalados en mi sistema.
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?
Consulte la ejecución automática de scripts de PowerShell durante la instalación y eliminación del paquete - http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package
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 ensamblajes x64 en una carpeta llamada ensambles x64 y x86 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.
Use 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''"
}
}
}
}
}
}
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)
}
}