57

我正在使用 Nuget 创建包。我想创建一个包,它不包含.nuspec任何其他 NuGet 包的任何依赖项(在 )文件中。我的项目确实在其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>

I believe this is happening because of this... (from the output above)

Found packages.config. Using packages listed as dependencies

How can I make NuGet not automatically resolve dependencies and insert them into the .nuspec file which is generated from the pack command?

I am using NuGet 2.2 currently. Also, I don't think that this behaviour happened in older version of NuGet; is this a new "feature"? I couldn't find any documentation describing this "feature" or when it was implemented.

4

6 回答 6

54

In version 2.7 there is an option called developmentDependency that can be set into package.config to avoid including dependency.

<?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>
于 2013-09-05T23:13:41.447 回答
31

Prevent your package from being dependent on other packages

As of NuGet 2.7 there is a new developmentDependency attribute that can be added to a package node in your project's packages.config file. So if your project includes a NuGet package that you don't want your NuGet package to include as a dependency, you can use this attribute like so:

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

The important bit that you need to add here is developmentDependency="true".

Prevent your development package from being depended on by other packages

If you are creating a development NuGet package for others to consume, that you know they will not want to have as a dependency in their packages, then you can avoid users having to manually add that attribute to their packages.config file by using the NuGet 2.8 developmentDependency attribute in the metadata section of your .nuspec file. This will automatically add the developmentDependency attribute to the packages.config file when the your package is installed by others. The catch here is that it requires the user to have at least NuGet 2.8 installed. Luckily, we can make use of the NuGet 2.5 minClientVersion attribute to ensure that users have at least v2.8 installed; otherwise they will be notified that they need to update their NuGet client before they can install the package.

I have a development NuGet package that this was perfect for. Here is what my .nuspec file looks like, showing how to use the minClientVersion and developmentDependency attributes (lines 3 and 20 respectively):

<?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>

If you don't want to force your users to have at least NuGet v2.8 installed before they can use your package, then you can use the solution I came up with and blogged about before the NuGet 2.8 developmentDependency attribute existed.

于 2014-06-14T05:29:18.563 回答
11

If you are using the PackageReference element instead of package.config file, here is the solution:

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc" PrivateAssets="All" />

or

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc">
   <PrivateAssets>all</PrivateAssets>
</PackageReference>

Related GitHub discussion

于 2017-07-06T07:06:16.103 回答
3

You can explicitly specify which files to include then run the pack command on the nuspec file itself.

<?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>

  <files>
    <file src="bin\Release\MyProject.dll" target="lib" />
  </files>

</package>

You should set the src attribute with the path that is relative to the nuspec file here. Then you can run the pack command.

nuget.exe pack MyProject\MyProject.nuspec
于 2013-02-21T22:14:02.297 回答
3

According to issue #1956 (https://nuget.codeplex.com/workitem/1956) and pull request 3998 (https://nuget.codeplex.com/SourceControl/network/forks/adamralph/nuget/contribution/3998) this feature has been included in the 2.4 release 2.7 release.

However I'm not able to find documentation about the feature, and I still haven't figured how to use it. Please update this answer if anyone knows.

Update: Issue #1956 has been updated by the developer. The feature was not included in the 2.4 release, but delayed to the upcoming 2.7 release. That's why it's not documented yet.

于 2013-05-13T13:59:01.330 回答
0

I'm not sure why you would want to ignore the dependencies that your NuGet package requires to run, but have you thought about using the NuGet Package Explorer tool instead to create your package?

于 2013-02-21T22:08:41.767 回答