我正在使用Nuget Package Explorer创建一些nuget包。我设法在VS中以Release模式构建项目并将dll和pdb文件添加到包中。
到目前为止一切顺利,但是当我将软件包添加到另一个项目并尝试在调试时进入代码时,它将改为执行它。
我知道如果我想在调试时进入代码,我需要构建并将Debug dll和pdb添加到我的包中。我不确定如何将这些添加到我已经创建的包中,该包已经包含Release dll和pdb文件,它们的名称相同。
有什么想法吗?
答案 0 :(得分:9)
我的想法是,NuGet包装很多关于约定。
为不同平台打包相同的名称空间和相同名称没有问题(如同lib/net40/mydll.dll
中的lib/net35/mydll.dll
,build
等),因为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