参照される依存関係を含むNuGetパッケージを自動的にビルドする


83

ローカル/内部のNuGetリポジトリ実行したい。NuGetを使用してダミープロジェクトに既存のNuGetパッケージを含め、パッケージファイルをスキャンしてローカルにキャッシュされた.nupkgファイルを取得することで、既存のNuGetパッケージを「再利用」する方法を理解したと思いますが...

NuGetを介して取得した依存関係だけでなく.nupkgすべての dll依存関係を自動的に含めて、プロジェクトからnugetパッケージ()をどのように作成しますか?

具体的には:

  1. ソリューションを作成する
  2. 新しいプロジェクトを追加する
  3. さまざまな.dllファイル/他のプロジェクトへの参照を追加する<-これは欠落している部分です
  4. パッケージマネージャー/コマンドラインなどを介してNuGetパッケージを追加します
  5. 何かが自動的に作成します.nupkg

私が見つけたものから、あなたは次のようなことをすることになっています

  • .csprojファイルを手動で編集して追加<BuildPackage>true</BuildPackage>し、依存関係を含めます
  • 手動で.nuspecファイルを作成し、依存関係を手動で一覧表示します同様の?
  • ファイルを手動で実行nuget packする.nuspec

しかし、すべてが手動であり、それは愚かです。半自動ソリューションでさえ、依然として厄介または半手動です。

.nuspecプロジェクト参照からマニフェストを自動的に作成するものに落ち着きます。次に、理論的には、+ nugetビルドイベントをbuild-project / nugetパッケージにロールアップできます。これは、私が本当に見たいものです。


私はこのVSの拡張に出くわしたeyecatch.no/projects/nuget-package-template ...私はに見てする必要があります
drzaus

3
5年後、nuget4.xの仕様またはパックはまだ依存関係を判別できません。
stingyJack 2017

この問題の更新はありますか?それともまだこれらの問題がありますか?
ドミニクジョナス

私はしばらく前にこれをあきらめましたが、この回答
drzaus 2017年

この問題はまだ存在します。:(
BrainSlugs83 2018年

回答:


75

あなたのポイント#3(さまざまな.dllファイル/他のプロジェクトへの参照を追加する<-これは欠けている部分です)には、実際には2つの異なる問題が含まれています:(1)さまざまなdllファイルへの参照を追加する、(2)で他のプロジェクトへの参照を追加する同じソリューション。

ここでの番号(2)は、NuGet2.5の時点でいくつかの追加サポートを受けています。プロジェクトのNuGetパッケージを作成するときに、同じソリューションに他のプロジェクトへの参照を含めるオプションを追加できます。

nuget pack projectfile.csproj -IncludeReferencedProjects

projectfile.csprojNuGetパッケージとして公開されているソリューション内の他のプロジェクトを参照している場合、これらのプロジェクトのNuGetパッケージは依存関係として追加されます。NuGetパッケージとして公開されていないソリューション内のプロジェクトを参照している場合、それらのdllはこのNuGetパッケージに含まれます。

(1)に関しては、NuGetパッケージとして利用できないdllをプロジェクトに追加することがよくある場合は、これらのファイルを使用して独自の(内部)NuGetパッケージを作成できます。次に、これらのdllをファイルではなくNuGetパッケージとして直接追加すると、このNuGetパッケージはプロジェクトのNuGetパッケージの依存関係になります。


3
ため息#1はまだ私の好みにはあまりにも手動です。実際、「これらのファイルを使用して独自の(内部)NuGetパッケージを作成する」ことが私がやろうとしていることです。この質問の要点は、NuGet以外の.dllをNuGetパッケージに自動的にロールアップしたいということです。を調べて各dllを手動でリストしないで.nuspecください。これはあなたが提案していることだと思いますか?
drzaus 2013年

各DLLを個別に指定する必要はありません。あなたがそれらの多くを持っているならば、それは確かに多くの仕事になるでしょう。含めるファイルを一覧表示する場合は、(再帰的な)ワイルドカード(docs.nuget.org/docs/reference/…)を使用できます。したがって、たとえば、これらすべてのDLLを別のフォルダーに配置する場合、含めるのは1つのライナーになります。モール。
ジュリアン

ああ、今私はあなたが行くところに着きます-それで私がラッパープロジェクトを作るなら、通常の「右クリックプロジェクト>参照の追加」を介して参照を含めます、そして私nuspecbinディレクトリ内のすべてを含むを作ることができます(私の参照を仮定してすべて「ローカルコピー」です)、追加したものはすべて自動的に取得されます。少し困惑しているようですが、おそらくうまくいくでしょう。
drzaus 2013年

6
binディレクトリにあるものはすべて自動的に取得されないため、次のように明示的に指定する必要があります<file src="bin\release\*.dll" target="lib" />
Julian

2
参照されているプロジェクトにnuspecファイルがある場合、nugetはそれをパッケージとして扱い、libフォルダーには含まれませんが、パッケージの依存関係に追加します
workabyte 2018年

5

他のGoogle社員の場合、NuGet.targetsファイルを使用してNuGet Packを実行している場合は、これを使用できます。

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>

7
有望に聞こえますが、実際に実装するには十分な情報がありません。あなたが話しているこのNuGet.targetsファイルは何ですか?私は、一般的には、ビルド対象ファイルではなく、この特定のユースケースに精通しています
bikeman868

2

これをチェックしてください!

私が見つけた解決策は、Visual Studioの拡張機能です:https//visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

あなたは、単にNugetパッケージと呼ばれる新しいプロジェクトを追加 NuGetパッケージを

次に、興味深いプロジェクトをリファレンスとBOOOMに追加します。すべての依存関係とファイルディレクトリが自動的に追加されます。NuSpecデータを変更する場合は、プロジェクトを右クリックして[プロパティ]に移動し、必要なものを変更します。生成されたNuSpecとnupkgは、新しいプロジェクトのobjフォルダーにあります。お役に立てば幸いです;)。


1
VS2017のソリューションもありますか?
ドミニクジョナス

ビルドサーバーでパッケージを生成する場合、これは機能しません。
Michi-2142

残念ながら、これは非推奨です。便利だっただろう。
joelc

2

私はこのトピックについてよく書かれた記事を見つけました。依存関係の階層を持つ特定のパッケージで同じ問題が発生し、これまで、それぞれを個別のNuGetパッケージとしてアップロードしてきました(時間の無駄)

ここにあるソリューションをテストしました:https//dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

また、NuGetパッケージエクスプローラーを使用してNuGetパッケージを調べた後、参照されたプロジェクトによって生成されたDLLが実際に存在します。このパッケージを実際にNuGetに送信してテストすることにより、テストします。

これがあなたに役立つ場合の私のソースです:https//github.com/jchristn/NuGetPackTest

そして、テストNuGetパッケージ:https//www.nuget.org/packages/NuGetPackTest/1.0.0

このソリューションはうまく機能しているようです。参照のレイヤーがある場合にどのように表示されるかはわかりませんが、非常に毛深い、非常に高速になる可能性があると確信しています。

ここに画像の説明を入力してください

プロジェクトTestLibraryを参照するNuGetPackTestライブラリの.csproj(簡潔にするために一部が削除されています)

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>

1
これは私の問題をすぐに解決しました。リンクに記載されている指示に従いましたが、機能しました。回答に要点も追加していただきありがとうございます。
ヤベツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.