3

他のソリューション/プロジェクト/などで使用される内部 C# プロジェクトのペア (最終的にはさらに多くなりますが、これら 2 つから開始) 用の NuGet パッケージを生成しようとしています。これらの内部 C# プロジェクトはどちらも、他の NuGet パッケージ (特にエンタープライズ ライブラリ ログ) への参照を持っています。私は、CSPROJ ファイルからパッケージをビルドできる Nuget の機能を使用して、私の生活を少し簡素化しています。問題は、プロジェクトが依存関係として参照するパッケージを Nuget.Exe ツールが識別しないことです。ソリューションの完全なレイアウトを提供するには:

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

コマンド ラインの出力の関連部分は次のとおりです。

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'.

「依存関係: Project1、Enterprise Libray Logging など」を期待していました。

*: プロジェクト間の依存部分を正しく機能させるには、Project1 と Project2 の両方に nuspec ファイルを追加する必要がありました。ただし、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ですが、それは少し異なり、そこに提示された解決策はどちらも機能していないようです。

同様の状況で正しく動作している人はいますか?

Visual Studio 2012 で NuGet 2.7 を使用しています。

4

3 に答える 3

8

最終的に NuGet のソース コードを調べたところ、問題が何であるかがわかりました。

私たちの場合、それは最終的に 2 つの別々の問題になりました。

  • プロジェクト自体のフォルダーには .sln ファイルがありました
  • ビルド スクリプトで pack コマンドを実行する前に、ソリューション レベルのパッケージ フォルダーを誤って空にしていました。

これらが問題を引き起こした理由は、NuGet がソリューション レベルのパッケージ フォルダーを検索して、プルするパッケージの依存関係を決定するためです (この決定がどのように行われるかはよくわかりません)。そのパッケージ フォルダーへのパスが正しくない場合 (NuGet が間違ったソリューション ファイルを使用する場合など)、依存関係を正しく解決できません。さらに、packages フォルダーが空の場合、依存関係を正しく解決することもできません。

于 2013-10-01T14:39:44.640 に答える
3

それを解決するために行った修正で、ポストビルドで次のスクリプトを実行しました。

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"  
}
于 2014-06-17T20:36:07.633 に答える