2013-09-12 7 views
3

Я пытаюсь создать пакеты NuGet для пары внутренних проектов C# (в конечном итоге больше, но начиная с этих двух), которые используются в других решениях/проектах/etc. Оба этих внутренних проекта C# имеют ссылки на другие пакеты NuGet (в частности, на регистрацию в корпоративной библиотеке). Я использую функцию Nuget, которая позволяет ему создавать пакеты из файла CSPROJ, чтобы немного упростить мою жизнь. Проблема в том, что средство Nuget.Exe не идентифицирует пакеты, которые проект ссылается как зависимости. Чтобы дать полный макет решения:NuGet не оценивает package.config

Solution: 
    Project 1 
     Refs to some NuGet packages off the global repository (Enterprise Library, etc etc). 
     (has a packages.config file that explicity lists them all) 
    Project 2 
     Refs to some NuGet packages off the global repository (Enterprise Library, etc. etc). 
     Project ref to Project 1 
     (has a packages.config file that explicity lists them all) 

командной строки я использую:

nuget pack Project2.csproj -IncludeReferencedProjects -verbosity detailed 

The Релевент части вывода командной строки являются:

Found packages.config. Using packages listed as dependencies 

Id: Project2 
Version: 1.0.0.0 
Authors: abc 
Description: abc 
Dependencies: Project1 (= 1.0.0.0) 

Added file 'lib\net35\project2.dll'. 

I ожидали «Зависимости: Project1, Enterprise Libray Logging и т. д. и т. д.»

* ПРИМЕЧАНИЕ: я должен был добавить файл nuspec как Project1, так и Project2 для правильной работы части зависимостей между проектами. Nuspec файл является по существу пустым, хотя, за исключением значений заполнителей:

<?xml version="1.0"?> 
<package > 
    <metadata> 
    <id>$id$</id> 
    <version>$version$</version> 
    <title>$title$</title> 
    <authors>abc</authors> 
    <owners>abc</owners> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>defr</description> 
    <copyright>Copyright 2013</copyright> 
    </metadata> 
</package> 

ближе всего я нашел на вопрос трекера NuGet является http://nuget.codeplex.com/workitem/3097, но немного отличается, и ни одно из решений, выдвинутых там, казалось, Работа.

У кого-нибудь есть аналогичная ситуация, работающая правильно?

Я использую NuGet 2.7 с Visual Studio 2012.

ответ

6

В итоге я просмотрел исходный код NuGet и выяснил, в чем проблема.

В нашем случае, это закончилось тем, что было два отдельных вопроса:

  • сами проекты имели .sln файлы в своих папках
  • Мы были неправильно Слив папку пакетов на уровне решения перед выполнением команды пакета в нашем скрипте сборки.

Причина, по которой эти проблемы вызывают проблемы, заключается в том, что NuGet ищет папку пакетов уровня решения, чтобы решить, какие зависимости пакетов втянуть (не совсем уверен, как это делается). Если путь к папке пакетов неверен (как и в случае, если NuGet использует неверный файл решения), он не может корректно разрешать зависимости. Кроме того, если папка пакетов пуста, она также не может корректно разрешать зависимости.

+0

этот ответ недооценивается ИМХО, и упускается из виду – BozoJoe

0

я столкнулся с точно такой же проблемой несколько недель назад, до версии 2.7 она работает. Все мои зависимости будут добавлены в манифест пакета. Когда я обновлялся с версии 2.6 до 2.7, он больше не работал, поэтому я создал задачу powershell, чтобы скопировать содержимое package.config в nuspec перед сборкой.

+1

Как вы думаете, что вы могли бы поделиться этим сценарием? – syazdani

+0

Я положил это как ответ вам в конце этого сообщения, даже если я думаю, что это способ опоздать. –

2

Моего фикса я сделал, чтобы решить, что я запущенный этот сценарий в моем postbuild:

param([string]$projectNuspec, [string]$projectName, [string]$projectPath) 

Function DisplayInfo([string] $text) 
{ 
     Write-Host "" 
     Write-Host "****************************" 
     Write-Host $text 
     Write-Host "****************************" 
     Write-Host "" 
} 

$csprojMustBeSaved = $false 
$packageFileName = [System.IO.Path]::Combine($projectPath, "packages.config") 

If(Test-Path $packageFileName) 
{ 
    $csprojMustBeSaved = $false 
    Write-host "Project is:" $projectName 
    Write-Host "Nuspec file is:" $packageFileName 
    $projectFullName = [System.IO.Path]::Combine($projectPath, $projectName) 
    $nuspecFullName = [System.IO.Path]::Combine($projectPath, $projectNuspec) 

    Write-Host "Open Nuspec File: " $packageFileName 
    $nuspecStream = [System.IO.File]::OpenText($nuspecFullName) 
    $nuspecDoc = New-Object System.Xml.XmlDocument 
    $nuspecDoc.Load($nuspecStream) 
    $nuspecStream.Dispose() 

    Write-Host "Open project File: " $projectFullName 
    $csprojStream = [System.IO.File]::OpenText($projectFullName) 
    $csprojDoc = New-Object System.Xml.XmlDocument 
    $csprojDoc.Load($csprojStream) 
    $csprojStream.Dispose() 

    $xnm = New-Object System.Xml.XmlNamespaceManager(New-Object System.Xml.NameTable); 
    $xnm.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003"); 

    [System.Xml.XmlNode]$metaData = $nuspecDoc.package.metadata 

    if($metaData.dependencies -ne $null) 
    { 
     DisplayInfo("Clear dependencies in nuspec") 
     foreach($dependencies in $metaData.dependencies) 
     { 
      $metaData.RemoveChild($dependencies) 
     }  
     DisplayInfo("Dependencies Cleared") 
    } 

    DisplayInfo("Open packages.config File: $packageFileName") 
    $packageFile = New-Object System.Xml.XmlDocument  
    $packageFile.Load($packageFileName) 

    $FirstTime = $true 
    foreach($package in $packageFile.packages.ChildNodes) 
    { 
     if(!$package.id.Equals("")) 
     { 
      if($FirstTime -eq $true) 
      { 
       $dependencies = $null 
       $dependencies = $nuspecDoc.CreateElement('dependencies', "http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd") 
       $nuspecDoc.package.metadata.AppendChild($dependencies) 
       $FirstTime = $false 
      } 

      Write-Host "Create dependency for: "$package.id"version: "$package.version 
      $dependency = $nuspecDoc.CreateElement('dependency', "http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd") 
      $dependency.SetAttribute('id',$package.id) 
      $packageVersion = [string]::Format("[{0}]",$package.version) 
      $dependency.SetAttribute('version',$packageVersion)    
      $dependencies.AppendChild($dependency)   
     } 
    } 

    if($csprojMustBeSaved -eq $true) 
    { 
     Write-Host "Save Csproj File: "$projectFullName 
     $csprojDoc.Save($projectFullName) 

     Write-host "File Saved successfuly" 
    } 

    Write-Host "Save Nuspec File: " $projectPath$projectNuspec 
    $nuspecDoc.Save($nuspecFullName); 
    Write-host "File Saved successfuly" 
} 
else 
{ 
    Write-Host "There is no " $packageFileName " skip this step" 
} 
Смежные вопросы