首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NuGet不尊重packages.config

NuGet不尊重packages.config
EN

Stack Overflow用户
提问于 2013-09-12 17:12:59
回答 3查看 3.5K关注 0票数 3

我试图为用于其他解决方案/项目/等等的一对内部C#项目(最终更多,但从这两个项目开始)生成C#包。这两个内部C#项目都引用了其他NuGet包(特别是企业库日志记录)。我正在使用Nuget的特性,它允许它从CSPROJ文件构建包,以简化我的生活。问题是,Nuget.Exe工具没有将项目引用的包标识为依赖项。要给出解决方案的完整布局:

代码语言:javascript
复制
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)

我使用的命令行是:

代码语言:javascript
复制
   nuget pack Project2.csproj -IncludeReferencedProjects -verbosity detailed

命令行输出的相关部分如下:

代码语言:javascript
复制
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日志等等”

*注意:我必须向Project1和Project2添加一个nuspec文件才能使项目间依赖部分正常工作。不过,nuspec文件实际上是空的,但占位符值除外:

代码语言:javascript
复制
<?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,但这一点略有不同,其中提出的解决方案似乎都不起作用。

有人有类似的情况正常工作吗?

我在2012中使用NuGet 2.7。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-01 14:39:44

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

在我们的例子中,它最终是两个不同的问题:

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

造成这些问题的原因是,NuGet查找解决方案级别的packages文件夹,以决定引入哪个包依赖项(不太确定如何进行此确定)。如果该包文件夹的路径不正确(就像NuGet使用错误的解决方案文件一样),那么它就不能正确地解析依赖项。此外,如果packages文件夹是空的,它也不能正确地解析依赖项。

票数 8
EN

Stack Overflow用户

发布于 2014-06-17 20:36:07

为了解决这个问题,我在后期构建中运行了这个脚本:

代码语言:javascript
复制
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"  
}
票数 3
EN

Stack Overflow用户

发布于 2013-09-13 18:19:17

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18770464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档