2011-10-14 8 views
36

Mam wersję binarną x86 i x64, którą chcę przesłać do NuGet. Jakie jest zalecenie lub wymagana metoda tworzenia/przesyłania tego pakietu? Nie mogę find much oprzeć mojej decyzji na. Widzę dwa sposoby ...Jak utworzyć lub załadować 32-bitowy i 64-bitowy pakiet NuGet?

  1. przesłać je obie w tym samym opakowaniu
    • Które należy instalowanej domyślnie?
    • Czy istnieje sposób przetestowania architektury procesora projektu w celu podjęcia decyzji?
  2. Prześlij dwa oddzielne pakiety

Bonus pytanie: Co zrobić, jeśli używam coś podobnego Chocolatey, który owija się Nuget z semantyki menedżera pakietów? Być może potrzebuję/chcę zainstalować pakiety x86 i x64 w moim systemie.

+3

Jeśli zdarzy się, że ten problem też, proszę up-głosowanie to praca Nuget pozycja: http://nuget.codeplex.com/workitem/679 –

+0

Czy są jakieś aktualizacje dotyczące tego problemu? – Sjoerd222888

+0

Pozwól mi zaktualizować pytanie, a przynajmniej moją odpowiedź.Ponieważ wierzę, że pytałem o pakiety Chocolatey, kiedy było bardzo młode i nie zawierały wbudowanych wbudowanych 32- i 64-bitowych funkcji. –

Odpowiedz

11

Byliśmy discussing podobny problem na Chocolatey Google Group. W NuGet nie ma żadnej semantyki. Wymaganie nie będzie, , jakiej architektury procesora używasz na. Musiałaby to być , która architektura procesora jest Twoim celem kierowania na projekt. A to komplikuje sytuację ... musielibyśmy również zrozumieć AnyCPU.

Myślę, że na razie prześlę dwie paczki. Zawsze mogę opublikować połączoną, gdy naprawię install.ps1, która może obsłużyć zapytanie o cel projektu.

mypackage.x86 
mypackage.x64 
+1

Jeśli zdarzy ci się ten problem, proszę oddaj głos temu dziełu NuGet: http://nuget.codeplex.com/workitem/679 –

+1

Tworzę dwa pakiety, rodzaj bólu, podniosłem ten problem na jakiś czas również: http://nuget.codeplex.com/discussions/400682#post931990 – eschneider

0

Wygląda na to, że nie ma określonego celu dla architektury 32- lub 64-bitowej. Trochę bólu, ale czy możesz coś zrobić za pomocą skryptów powershell (install.ps1), aby wykryć architekturę i odpowiednio ją zainstalować?

Zobacz Automatyczne uruchamianie skryptów PowerShell podczas instalowania i usuwania pakietu - http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

13

Możesz dodać obsługę projektu x64 i x86 do projektu, używając referencji warunkowych. Wydaje się, że na razie Nuget nie lubi dwóch odniesień o tej samej nazwie. Musimy więc ręcznie dodać drugie odniesienie, a następnie uzależnić odniesienia.

Zapisywanie złożeń x64 w folderze o nazwie x64 & Zestawy x86 w folderze o nazwie x86 Muszą mieć obie te same nazwy zespołu. Następnie zaktualizuj tablicę allowedReferences o nazwy wszystkich złożeń do dodania.

Skorzystaj z następujących skryptów.

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

była duża pomoc, dzięki. – 0x1mason