2011-10-14 17 views
36

私はNuGetにアップロードしたいバイナリのx86とx64バージョンを持っています。そのパッケージを作成/アップロードするための推奨または必要な方法は何ですか?私はfind much私の決定の根拠にすることはできません。私は2つの方法... 32ビットおよび64ビットのNuGetパッケージを作成またはアップロードするにはどうすればよいですか?

  1. 一つは、私は、デフォルトでインストールする必要があり、同じパッケージ
    • でそれらの両方をアップロードを参照してください?
    • プロジェクトのプロセッサアーキテクチャをテストして決定する方法はありますか?
  2. アップロード2つの別々のパッケージ

ボーナス質問:私はパッケージマネージャのセマンティクスでNuGetを締めくくりChocolateyのようなものを、使用している場合は?自分のシステムにx86とx64パッケージがインストールされている必要があります。

+3

あなたも、この問題を持っているために起こる場合は、してくださいアップ投票この作品NuGetアイテム:http://nuget.codeplex.com/workitem/679 –

+0

この問題に関する最新情報はありますか? – Sjoerd222888

+0

私は質問を更新し、少なくとも、私の答えを教えてください。私はChocolateyのパッケージが非常に若くて、堅牢な32ビットと64ビットの機能が組み込まれていないと尋ねていたと信じています。 –

答えて

11

我々はChocolatey Google Groupdiscussing同様の問題となってきました。 NuGetに組み込まれているセマンティクスはありません。要件は、あなたが実行しているプロセッサアーキテクチャはではありません。あなたのプロジェクトをターゲットにしているのはどのプロセッサアーキテクチャですか。です。そしてそれは事を複雑にする...あなたはAnyCPUも理解しなければならないでしょう。

今のところ、2つのパッケージをアップロードするつもりです。私はinstall.ps1を修正してプロジェクトターゲットのクエリを処理できるときは、いつも一緒に公開することができます。

mypackage.x86 
mypackage.x64 
+1

この問題が起きた場合は、この作品をアップしてくださいNuGet item: http://nuget.codeplex.com/workitem/679 –

+1

私は2つのパッケージを作る、痛みの種類、私はこの問題をもう一度提起した:http://nuget.codeplex.com/discussions/400682#post931990 – eschneider

0

32または64ビットアーキテクチャでは特定のターゲットがないようです。ちょっとした痛みですが、PowerShellスクリプト(install.ps1)で何かをしてアーキテクチャを検出し、それに応じてインストールできますか?

は、自動的にパッケージのインストールおよび削除の際PowerShellスクリプトの実行を参照してください - http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

13

条件付き参照を使用して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) 
    } 
} 
+0

これはありがとうございました。 – 0x1mason

関連する問題