如何使用nuget package explorer创建发布和调试dll的nuget包?

Pro*_*uck 15 c# dll nuget-package

我正在使用Nuget Package Explorer来创建一些nuget包.我设法在VS中以Release模式构建项目并将dll和pdb文件添加到包中.

到目前为止一切都那么好,但是当我将软件包添加到另一个项目并尝试在调试时进入代码时,它将改为执行它.

我知道如果我想在调试时进入代码,我需要构建并将Debug dll和pdb添加到我的包中.我不确定如何将这些添加到我已经创建的包中,该包已经包含Release dll和pdb文件,它们的名称相同.

有什么想法吗?

Tew*_*ewr 11

我的想法是,NuGet包装很多关于约定.

有一个在包装相同的命名空间和相同的名字没有问题的不同的平台(如lib/net40/mydll.dll,lib/net35/mydll.dll等在同一个包),为的NuGet将平台筛选注册的依赖.

为同一平台构建多个版本似乎是非常规的,这种讨论偏向于为每个构建制作一个包.这并不意味着你不能这样做,但你首先应该问自己是否应该这样做.

也就是说,如果您的调试和发布版本非常不同(条件编译等),这可能会有用.但是,在安装软件包时,最终用户将如何选择Release或Debug?

一个想法可能是,每个构建配置一个版本.两者都可以安装到项目中.要做到这一点,要么将目标文件添加到包中,要么构建一个powershell安装脚本,直接在目标项目文件中添加条件引用,如果你想要的东西比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>
Run Code Online (Sandbox Code Playgroud)

为您提供创建的调试和发布文件夹(平台文件夹是可选的),构建输出将根据配置进行有效更改 - 提供的数据包使用者具有传统的配置名称,但您可以随时使用$(Configuration)扩展条件逻辑.Contains等或者只是把它放在包自述文件中


Ary*_*dlé 5

受到@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  
Run Code Online (Sandbox Code Playgroud)

目标文件内容:

<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>
Run Code Online (Sandbox Code Playgroud)

lib文件夹中的dll 将自动添加为引用,在项目文件中创建以下内容:

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

第一次构建项目后,目标会将发布和调试版本从tools\releasetools\debug文件夹复制到lib \net\releaselib \net\debug文件夹.最后,它将删除lib \net\$(Configuration)文件夹

享受(或不 - 我个人不喜欢这个解决方案).