【问题标题】:NuGet does not honour packages.configNuGet 不支持 packages.config
【发布时间】:2013-09-17 04:56:14
【问题描述】:

我正在尝试为在其他解决方案/项目/等中使用的一对内部 C# 项目(最终更多,但从这两个项目开始)生成 NuGet 包。这两个内部 C# 项目都引用了其他 NuGet 包(尤其是企业库日志记录)。我正在使用 Nuget 的功能,它允许它从 CSPROJ 文件构建包以简化我的生活。问题是 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。

【问题讨论】:

    标签: c# visual-studio-2012 nuget nuget-package


    【解决方案1】:

    几周前我遇到了完全相同的问题,在版本 2.7 之前它可以工作。我所有的依赖项都将添加到包清单中。当我从 2.6 版更新到 2.7 版时,它不再工作了,所以我创建了一个 powershell 任务,在构建之前将 package.config 的内容复制到 nuspec。

    【讨论】:

    • 你认为你可以分享这个脚本吗?
    • 即使我认为为时已晚,我还是把它作为对您的回复放在了这篇文章的末尾。
    【解决方案2】:

    我最终查看了 NuGet 源代码,发现了我们遇到的问题。

    在我们的案例中,它最终成为两个独立的问题:

    • 项目本身的文件夹中有 .sln 文件
    • 在构建脚本中执行 pack 命令之前,我们错误地清空了解决方案级别的包文件夹。

    这些导致问题的原因是因为 NuGet 会查找解决方案级别的包文件夹来决定要拉入哪些包依赖项(不太确定如何做出此决定)。如果该包文件夹的路径不正确(就像 NuGet 使用错误的解决方案文件一样),则它无法正确解析依赖项。另外如果packages文件夹为空,也无法正确解析依赖。

    【讨论】:

    • 这个答案被低估了恕我直言,并且被忽视了
    【解决方案3】:

    我为解决这个问题所做的修复,我在我的 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"  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多