web-dev-qa-db-ja.com

nugetパッケージエクスプローラーを使用して、リリースdllとデバッグdllの両方でnugetパッケージを作成するにはどうすればよいですか?

Nugetパッケージエクスプローラーを使用して、いくつかのnugetパッケージを作成しています。 VSでリリースモードでプロジェクトをビルドし、dllファイルとpdbファイルの両方をパッケージに追加するだけでなんとかできました。

これまでのところ良好ですが、パッケージを別のプロジェクトに追加し、デバッグ中にコードにステップインしようとすると、代わりにステップオーバーします。

デバッグ中にコードにステップインしたい場合は、デバッグdllとpdbをビルドしてパッケージに追加する必要があることを理解しています。すでに作成したパッケージにこれらを追加する方法はわかりませんが、同じ名前のリリースdllファイルとpdbファイルがすでに含まれています。

何かご意見は?

15
Prowling Duck

私の考えでは、NuGetのパッケージ化は慣習に関するものがたくさんあります。

異なるプラットフォームの同じ名前空間と同じ名前をパッケージ化することに問題はありません(同じ中にlib/net40/mydll.dlllib/net35/mydll.dllなどのように)パッケージ)、NuGetは登録された依存関係をプラットフォームでフィルタリングするため。

同じプラットフォーム用に複数のバージョンをビルドすることは型破りなこの議論 ビルドごとにパッケージを作成することに偏っているようです。それはあなたがそれをすることができないという意味ではありません、しかしあなたはあなたがそうするべきであるかどうか最初にあなた自身に尋ねるべきです。

とはいえ、デバッグビルドとリリースビルドが大きく異なる場合(条件付きコンパイルなど)、これは役立つ場合があります。しかし、エンドユーザーはパッケージをインストールするときにどのようにリリースまたはデバッグを選択しますか?

アイデアは、ビルド構成ごとに1つのバージョンである可能性があります。 どちらもプロジェクトにインストールできます 。これを行うには、 パッケージにターゲットファイル を追加するか、ビルドします PowerShellインストールスクリプトNuget v 以降サポートされていません)MsBuildで実行できるものよりも基本的でないものが必要な場合は、ターゲットプロジェクトファイルに条件付き参照を直接追加します。

最初の戦術の例:.targetファイルを作成します(パッケージにbuildフォルダーを作成してから、次の内容でbuild\YourLib.targetsを作成します)。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
    <Reference Include="YourLib">
      <HintPath>..\packages\YourLib.1.0.0\lib\Debug\YourLib.dll</HintPath>
    </Reference>
  </ItemGroup>

  <ItemGroup Condition="'$(Configuration)' == 'Release'">
    <Reference Include="YourLib">
      <HintPath>..\packages\YourLib.1.0.0\lib\Release\YourLib.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

デバッグフォルダーとリリースフォルダーを作成した場合(プラットフォームフォルダーはオプション)、ビルド出力は構成に応じて効果的に変更されます-パケットコンシューマーが従来の構成名を持っている場合、ただし、条件ロジックを $(Configuration).Contains etc でいつでも少し拡張するか、パッケージのreadmeに入れることができます。

11
Tewr

@Tewrに触発されて、面倒ですが実用的な解決策を見つけました。

次のファイル構造でNugetを作成します。

lib\net\$(Configuration)\YourLib.1.0.0.dll    <---- put here some dummy file  named YourLib.1.0.0.dll
tools\release\YourLib.1.0.0.dll  <--- put here the release version
tools\debug\YourLib.1.0.0.dll  <--- put here the debug version
build\YourLib.targets  

ターゲットファイルの内容:

<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<Target Name="CopyReferences" BeforeTargets="Build" Condition="Exists('..\packages\YourLib.1.0.0\lib\net\%24(Configuration)')">     
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Release" />
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Debug" />
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Release\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Release"' />
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Debug\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Debug"' />
    <Exec Command='rmdir /S /Q "..\packages\YourLib.1.0.0\lib\net\%24(Configuration)"' />
</Target>

libフォルダー内のdllは、参照として自動的に追加され、プロジェクトファイルに以下を作成します。

<Reference Include="YourLib>   
    <HintPath>..\packages\YourLib.1.0.0\lib\net\$(Configuration)\YourLib.1.0.0.dll</HintPath>
    <Private>True</Private>
</Reference>

プロジェクトを初めてビルドすると、ターゲットはリリースとデバッグのバージョンをtools\releaseおよびtools\debugフォルダーからlib\net)にコピーします。\releaseおよびlib\net\debugフォルダー。最後に、lib\net\$(Configuration)フォルダーを削除します

楽しんでください(またはそうではありません-私は個人的に解決策が好きではありません)。

5
Arie R

ありがとう@Tewr新しい nuget 形式とsdkスタイルのcsproj形式では、現在のファイルパスを取得するために$(MSBuildThisFileDirectory)として定数を使用できます。

このバージョンを使用するコードは、メンテナンスの難しさを増します。 sdkスタイルのcsproj形式は、パッケージファイルをパッケージフォルダーに出力しない新しいパッケージ形式を使用します。

ターゲットファイルをビルドフォルダーに追加し、$(MSBuildThisFileDirectory)を使用してファイルパスを取得できます。

<ItemGroup Condition="'$(Configuration)' == 'DEBUG'">
    <Reference Include="YourLib">
        <HintPath>$(MSBuildThisFileDirectory)..\lib\debug\YourLib.dll</HintPath>
    </Reference>
</ItemGroup>

ファイル を参照してください

0
lindexi