【问题标题】:How to create a nuget package with both release and debug dll's using nuget package explorer?如何使用 nuget 包资源管理器创建具有发布和调试 dll 的 nuget 包?
【发布时间】:2016-10-07 00:30:37
【问题描述】:

我正在使用 Nuget 包资源管理器创建一些 nuget 包。我已经设法做到了,只需在 VS 中以发布模式构建一个项目,并将 dll 和 pdb 文件都添加到包中。

到目前为止一切顺利,但是当我将包添加到另一个项目并尝试在调试时单步执行代码时,它会改为单步执行。

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

有什么想法吗?

【问题讨论】:

标签: c# dll nuget-package


【解决方案1】:

我的想法是,NuGet 打包与约定有关。

不同的平台打包相同的命名空间和相同的名称没有问题(如在同一包中的lib/net40/mydll.dlllib/net35/mydll.dll 等),因为NuGet 将按平台过滤注册的依赖项。

为同一个平台构建多个版本似乎非常规this discussion 倾向于在每个构建中制作一个包。这并不意味着你不能这样做,但你应该先问问自己是否应该这样做。

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

一个想法可能是,每个构建配置一个版本。 Both can be installed into the project。为此,添加targets file to your package 或构建a powershell install script(自Nuget v3 以来不受支持)直接在目标项目文件中添加条件引用,如果您想要一些比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 或者只是把它放在包自述文件中

【讨论】:

    【解决方案2】:

    受@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\releasetools\debug 文件夹复制到 lib \net\releaselib\net\debug 文件夹。最后,它会删除 lib\net\$(Configuration) 文件夹

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

    【讨论】:

    • 应该关注这个答案。谢谢。
    • @LeoLiu-MSFT 为什么?你想分享任何替代方案吗?
    【解决方案3】:

    感谢@Tewr 在新的nuget 格式和sdk 风格的csproj 格式中,我们可以使用一些常量作为$(MSBuildThisFileDirectory) 来获取当前文件路径。

    使用版本的代码会增加维护难度。 sdk风格的csproj格式使用新的包格式,不会将包文件输出到包文件夹中。

    我们可以将目标文件添加到构建文件夹并使用$(MSBuildThisFileDirectory)获取文件路径。

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

    file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多