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

时间:2016-06-07 07:59:30

标签: c# dll nuget-package

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

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

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

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

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

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

一个想法可能是,每个构建配置一个版本。 Both can be installed into the project。要做到这一点,要么添加targets file to your package或构建 a powershell install script (自Nuget v3以来不支持),直接在目标项目文件中添加条件引用,如果你想要的话不像MsBuild能为你做的那么简单。

第一个策略的示例:创建.target文件(在您的包中,创建一个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> ):

    public function up(Schema $schema)
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('DROP TABLE sessions');
        //More sql
    }

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

答案 1 :(得分: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  

目标文件内容:

<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 \ $(配置)文件夹

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

答案 2 :(得分:0)

感谢@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