web-dev-qa-db-ja.com

NuGetパッケージの作成時にpackages.configファイルの依存関係を含めないでください

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

NuGetnotを自動的に依存関係を解決し、packコマンドから生成される.nuspecファイルに挿入するにはどうすればよいですか?

現在、NuGet 2.2を使用しています。また、この動作が古いバージョンのNuGetで発生したとは思いません。これは新しい「機能」ですか?この「機能」について、またはいつ実装されたかを説明したドキュメントは見つかりませんでした。

52
Jesse Webb

バージョン2.7には、dependencyが含まれないようにpackage.configに設定できるdevelopmentDependencyというオプションがあります。

パッケージ作成時の開発依存関係を除く

<?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>
46
David C

パッケージが他のパッケージに依存しないようにする

NuGet 2.7には、新しいdevelopmentDependency属性がありますプロジェクトのpackages.configファイルのpackageノードに追加 です。したがって、プロジェクトに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パッケージを作成している場合、パッケージ内の依存関係として使用したくないことがわかっている場合は、-を使用してユーザーが手動でその属性をpackages.configファイルに追加する必要を回避できます。 NuGet 2.8 _。$ specファイルのメタデータセクションのdevelopmentDependency属性 。これにより、パッケージが他の人によってインストールされたときに、packages.configファイルにdevelopmentDependency属性が自動的に追加されます。ここでの問題は、ユーザーが少なくともNuGet 2.8をインストールする必要があることです。幸いなことに、 NuGet 2.5 minClientVersion属性 を使用して、ユーザーに少なくとも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>

パッケージを使用する前にユーザーに少なくともNuGet v2.8をインストールするように強制したくない場合は、NuGet 2.8の前に 私が思いついたブログを作成したソリューション を使用できます。 developmentDependency属性が存在しました。

27
deadlydog

package.configファイルの代わりにPackageReference要素を使用している場合、解決策は次のとおりです。

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

または

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

関連するGitHubのディスカッション

9
Philippe

含めるファイルを明示的に指定してから、nuspecファイル自体でpackコマンドを実行できます。

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

ここで、nuspecファイルに相対的なパスでsrc属性を設定する必要があります。その後、packコマンドを実行できます。

nuget.exe pack MyProject\MyProject.nuspec

問題#1956( https://nuget.codeplex.com/workitem/1956 )およびプルリクエスト3998( https://nuget.codeplex.com/SourceControl/network/ forks/adamralph/nuget/contribution/3998 )この機能は、 2.4リリース 2.7リリース。

ただし、この機能に関するドキュメントを見つけることができず、まだ使用方法がわかりません。誰でも知っている場合は、この回答を更新してください。

更新:問題#1956は開発者によって更新されました。この機能は2.4リリースには含まれていませんでしたが、今後の2.7リリースに遅れました。それがまだ文書化されていない理由です。

NuGetパッケージの実行に必要な依存関係を無視したい理由がわかりませんが、パッケージを作成する代わりに NuGet Package Explorer ツールを使用することを考えましたか?

0
devdigital