当前位置: 首页 > 知识库问答 >
问题:

在创建NuGet包时,不要包含Packages.config文件中的依赖项

公羊浩阔
2023-03-14

我正在使用Nuget创建包。我想创建一个包,该包不包含任何其他NuGet包的依赖项(在.nuspec文件中)。我的项目确实在其packages.config文件中定义了NuGet包依赖项。

首先创建.nuspec文件...

C:\code\MySolution>.nuget\nuget.exe spec MyProject\MyProject.csproj

我将生成的.nuspec文件编辑为最小,没有依赖项。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyProject</id>
    <version>1.2.3</version>
    <title>MyProject</title>
    <authors>Example</authors>
    <owners>Example</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Example</description>
    <copyright>Copyright 2013 Example</copyright>
    <tags>example</tags>
    <dependencies />
  </metadata>
</package>

然后我构建了解决方案并创建了一个NuGet包...

C:\code\MySolution>.nuget\nuget.exe pack MyProject\MyProject.csproj -Verbosity detailed

下面是该命令的输出...

Attempting to build package from 'MyProject.csproj'.
Packing files from 'C:\code\MySolution\MyProject\bin\Debug'.
Using 'MyProject.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies

Id: MyProject
Version: 1.2.3
Authors: Example
Description: Example
Tags: example
Dependencies: Google.ProtocolBuffers (= 2.4.1.473)

Added file 'lib\net40\MyProject.dll'.

Successfully created package 'C:\code\MySolution\MyProject.1.2.3.nupkg'.

创建的.nupkg包包含一个.nuspec文件,但它包含一个依赖项节,而我在原始.nuspec文件中没有这个节...

<dependencies>
  <dependency id="Google.ProtocolBuffers" version="2.4.1.473" />
</dependencies>

我相信这是因为...(来自上面的输出)

Found packages.config. Using packages listed as dependencies

如何使NuGet不自动解析依赖项并将其插入.nuspec文件(该文件是由pack命令生成的)?

我目前正在使用NuGet2.2。而且,我不认为这种行为发生在老版本的Nuget;这是一个新的“特征”吗?我找不到任何描述这个“特性”的文档,也找不到它何时实现的文档。

共有2个答案

洪俊能
2023-03-14

从NuGet 2.7开始,有一个新的developmentDependency属性可以添加到项目的packages.config文件中的packages节点。因此,如果您的项目包含了一个您不希望您的NuGet包作为依赖项包含的NuGet包,您可以像这样使用这个属性:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CreateNewNuGetPackageFromProjectAfterEachBuild" version="1.8.1-Prerelease1" targetFramework="net45" developmentDependency="true" />
</packages>

这里需要添加的重要部分是developmentdependency=“true”

如果您正在创建一个开发NuGet包供其他人使用,并且您知道他们不希望在其包中作为依赖项使用,那么您可以通过在.nuspec文件的元数据部分使用NuGet 2.8developmentdependency属性,避免用户手动将该属性添加到其packages.config文件中。这将在其他人安装您的软件包时自动向Packages.config文件添加developmentDependency属性。这里的问题在于,它要求用户至少安装了NuGet2.8。幸运的是,我们可以利用NuGet 2.5minClientVersion属性来确保用户至少安装了V2.8;否则,他们将收到通知,他们需要在安装软件包之前更新NuGet客户端。

我有一个开发NuGet包,这是完美的。下面是我的.nuspec文件的样子,展示了如何使用minClientVersion和developmentDependency属性(分别是第3行和第20行):

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata minClientVersion="2.8">
    <id>CreateNewNuGetPackageFromProjectAfterEachBuild</id>
    <version>1.8.1-Prerelease1</version>
    <title>Create New NuGet Package From Project After Each Build</title>
    <authors>Daniel Schroeder,iQmetrix</authors>
    <owners>Daniel Schroeder,iQmetrix</owners>
    <licenseUrl>https://newnugetpackage.codeplex.com/license</licenseUrl>
    <projectUrl>https://newnugetpackage.codeplex.com/wikipage?title=NuGet%20Package%20To%20Create%20A%20NuGet%20Package%20From%20Your%20Project%20After%20Every%20Build</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Automatically creates a NuGet package from your project each time it builds. The NuGet package is placed in the project's output directory.
    If you want to use a .nuspec file, place it in the same directory as the project's project file (e.g. .csproj, .vbproj, .fsproj).
    This adds a PostBuildScripts folder to your project to house the PowerShell script that is called from the project's Post-Build event to create the NuGet package.
    If it does not seem to be working, check the Output window for any errors that may have occurred.</description>
    <summary>Automatically creates a NuGet package from your project each time it builds.</summary>
    <releaseNotes>- Changed to use new NuGet built-in method of marking this package as a developmentDependency (now requires NuGet client 2.8 or higher to download this package).</releaseNotes>
    <copyright>Daniel Schroeder 2013</copyright>
    <tags>Auto Automatic Automatically Build Pack Create New NuGet Package From Project After Each Build On PowerShell Power Shell .nupkg new nuget package NewNuGetPackage New-NuGetPackage</tags>
    <developmentDependency>true</developmentDependency>
  </metadata>
  <files>
    <file src="..\New-NuGetPackage.ps1" target="content\PostBuildScripts\New-NuGetPackage.ps1" />
    <file src="Content\NuGet.exe" target="content\PostBuildScripts\NuGet.exe" />
    <file src="Content\BuildNewPackage-RanAutomatically.ps1" target="content\PostBuildScripts\BuildNewPackage-RanAutomatically.ps1" />
    <file src="Content\UploadPackage-RunManually.ps1" target="content\PostBuildScripts\UploadPackage-RunManually.ps1" />
    <file src="Content\UploadPackage-RunManually.bat" target="content\PostBuildScripts\UploadPackage-RunManually.bat" />
    <file src="tools\Install.ps1" target="tools\Install.ps1" />
    <file src="tools\Uninstall.ps1" target="tools\Uninstall.ps1" />
  </files>
</package>

如果您不想强迫您的用户在使用您的软件包之前至少安装了NuGetV2.8,那么您可以在NuGet2.8 developmentDependency属性存在之前使用我提出并在博客中介绍的解决方案。

金骞尧
2023-03-14

在版本2.7中,有一个名为developmentDependency的选项可以设置到package.config中,以避免包含依赖项。

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="jQuery" version="1.5.2" />
    <package id="netfx-Guard" version="1.3.3.2" developmentDependency="true" />
    <package id="microsoft-web-helpers" version="1.15" />
</packages>
 类似资料:
  • 我正在使用Daniel Schroeder的“create New NuGet Package from project after Each build”NuGet Package来通过Visual Studio2013从我的项目中自动创建NuGet Package。当在.nuspec文件中指定组依赖项时,我遇到了一个问题。这是我的.nuspec文件中的内容: 依赖项包含在包中,但它们并不绑定到

  • 问题内容: 我在Eclipse中有一个对我的工作区中的另一个Java项目有依赖性的对象。在内置的Tomcat服务器中运行Web项目时,我已将项目依赖项添加到 运行配置中 的类路径中。我想创建一个WAR,用于在外部服务器上部署Web项目。依赖性Java项目已添加到Eclipse中的 Java Build路径 ,但是当我导出WAR文件时,该库不包括在内。还可以在 Order and Export中 选

  • 我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner

  • 我有一个jar,build-plugins.jar和一个gradle插件,它是用build.gradle中的这个插件构建的: 这将构建build-plugins.jar。并且使用插件的项目按文件引用插件jar 问题是当我运行第二个项目的任何任务时,我得到的是“class proxy created for class XYZ”,根本原因是四个依赖项(joda-time、commons-io、str

  • 我将给你一个关于我的文件的概述: 设置。分级: Build.Gradle: 注意:我以为没有将依赖项添加到类路径中,但我不确定这一点。但是,我希望Intellij将依赖项添加到类路径中(或者在清单文件中声明) 但是,这会创建一个zip/tar,其中包含一个执行脚本和一个bin文件夹,这不是我的本意。 所以我开始在谷歌上搜索了好几个小时,但我找不到解决问题的方法。

  • 问题内容: 在“撰写设置脚本(http://docs.python.org/2/distutils/setupscript.html)”的python文档中提到可以在本节中指定依赖项 > 2.4。发行与包装之间的关系 […]可以使用distutils.core.setup()函数的关键字参数来指定这些关系。 可以通过向setup()提供require关键字参数来指定对其他Python模块和软件包的