2016-06-07 166 views
8

我正在使用Nuget包资源管理器来创建一些nuget包。我已经设法在VS中以发布模式构建项目,并将dll和pdb文件添加到包中。如何使用nuget package explorer创建一个包含release和debug dll的nuget包?

到目前为止这么好,但是当我将包添加到另一个项目中并尝试在调试时插入代码时,它将替代它。

据我所知,我需要构建并添加Debug dll和pdb到我的包中,如果我想在调试时插入代码。我不确定如何将这些添加到我已经创建的包中,这些包已经包含Release dll和pdb文件,它们的命名方式相同。

有什么想法?

回答

5

我的想法是,NuGet包装是很多约定。

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

针对相同平台构建多个版本似乎非常规,this discussion倾向于每个构建包。这并不意味着你不能这样做,但你应该首先问自己是否应该这样做。这就是说,如果你的调试和发布版本是非常不同的(条件编译等),但这可能很有用。但是,在安装软件包时,最终用户如何选择Release或Debug?

一个想法可能是,每个版本配置一个版本。 Both can be installed into the project。要做到这一点,可以添加一个targets file to your package或者编译a powershell install script,它可以直接在目标项目文件中添加条件引用,如果你想要的东西比任何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扩展条件逻辑,或者只是将其放在包中自述文件

3

受@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> 

一旦你构建项目的第一次,则目标将复制从工具的发行和调试版本\释放工具\调试文件夹的lib \网络\释放的lib \网\调试文件夹。最后,它会删除lib \ net \ $(配置)文件夹

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

+1

这个答案应该关注。谢谢。 –