NuGetにアップロードしたいバイナリのx86およびx64バージョンがあります。そのパッケージを作成/アップロードするための推奨事項または必要な方法は何ですか?私は 多くを見つける 私の決定の基礎となることができません。 2つの方法があります...
ボーナス質問:NuGetをパッケージマネージャーのセマンティクスでラップする Chocolatey のようなものを使用している場合はどうなりますか?システムにx86およびx64パッケージをインストールする必要がある/必要な場合があります。
discussingChocolatey Google Group でも同様の問題が発生しています。 NuGetに組み込まれているセマンティクスはありません。要件は、どのプロセッサアーキテクチャで実行されているかではありません。それはプロジェクトが対象としているプロセッサアーキテクチャである必要があります。そしてそれは物事を複雑にします...あなたはAnyCPU
も理解する必要があります。
今のところ、2つのパッケージをアップロードするつもりです。プロジェクトターゲットのクエリを処理できる_install.ps1
_を修正すると、いつでも結合されたものを公開できます。
_mypackage.x86
mypackage.x64
_
条件付き参照を使用して、x64およびx86サポートをプロジェクトに追加できます。今のところ、Nugetは同じ名前の2つの参照を持つことを好まないようです。したがって、2番目の参照を手動で追加してから、参照を条件付きにする必要があります。
X64アセンブリをx64というフォルダーに保存し、x86アセンブリをx86というフォルダーに保存します。両方とも同じアセンブリ名である必要があります。次に、allowedReferences配列を、追加するすべてのアセンブリの名前で更新します。
次のスクリプトを使用します。
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)
}
}
32ビットまたは64ビットアーキテクチャの特定のターゲットはないようです。少し面倒ですが、PowerShellスクリプト(install.ps1)を使用してアーキテクチャを検出し、それに応じてインストールすることはできますか?
パッケージのインストールおよび削除中にPowerShellスクリプトを自動的に実行する http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package を参照してください。