title author date CreateTime categories
VisualStudio 如何在 NuGet 包里面同时包含 DEBUG 和 RELEASE 的库
lindexi
2019-04-15 16:13:42 +0800
2019-04-15 14:37:12 +0800
VisualStudio 调试 nuget

我在开发的时候需要使用到一些 DEBUG 库进行调试,但是我的库是通过 NuGet 给用户的,如果在 NuGet 里面使用到了 DEBUG 的库那么会让代码的运行效率降低。于是我就找到一个方法,可以在 NuGet 同时打包调试和发布的包,这样在用户调试的时候就可以使用调试的代码

我在一个库写代码,我需要做一点黑科技,让吕毅 在调试的时候输出的是 林德熙是逗比,但是在他发布的时候却输出吕毅是逗比那么我需要如何做?

打开 VisualStudio 2019 创建一个项目,然后添加下面一点代码

using System;

namespace LerewararraNurfabeyo
{
public class WijonakabaiBohallcallcem
{
public void Foo()
{
#if DEBUG
Console.WriteLine("林德熙是逗比");
#else
Console.WriteLine("吕毅是逗比");
#endif }
}
}

使用右击一键打包 NuGet 的方法创建一个 NuGet 包,这是 VisualStudio 2017 的 VisualStudio 使用新项目格式快速打出 Nuget 包 功能很好用

再创建一个项目,为了直接引用上面测试项目的 NuGet 需要做一点黑科技,第一步是让测试项目的 NuGet 输出到一个文件夹

在 sln 所在的文件夹添加 Directory.Build.props 文件,在这个文件可以设置全局的项目输出的文件夹

<Project>
<PropertyGroup>
<PackageOutputPath>$(MSBuildThisFileDirectory)package</PackageOutputPath>
</PropertyGroup>
</Project>

于是测试项目就会输出到这个文件夹,下面再创建一个控制台项目,在这个项目里面引用测试项目的代码

我是在相同的 sln 创建项目,所以写的文件夹都是相对的,文件夹请看 代码

为了引用到测试项目的输出需要添加 nuget.config 文件,通过在命令行输入 dotnet new nuget 就可以成功创建,创建完成需要修改相对文件夹,这个科技请看VisualStudio 给项目添加特殊的 Nuget 的链接 通过这个文件可以修改本地的输出

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear/>
<add key="nuget" value="..\package" />
</packageSources>
</configuration>

具体文件请看: nuget.config

通过 dotnet add package 测试项目名 可以安装了测试项目的输出,具体请看 代码

现在开始尝试编译,会发现无论是 DEBUG 下还是发布版本都是输出 林德熙是逗比,这样显然不是我需要的

现在简单的方法已经解决不了了,可以通过复杂的 NuGet 命令做到,先添加 NuGet 到环境变量,这样可以在任意的地方使用到命令

https://www.nuget.org/downloads 下载最新的 Nuget 软件

通过输入 Nuget 命令创建 LerewararraNurfabeyo.nuspec 文件,这个命令请看NuGet CLI spec command

nuget spec LerewararraNurfabeyo.csproj

现在就创建了 LerewararraNurfabeyo.nuspec 文件,需要在这个文件里面替换很多代码

<?xml version="1.0"?>
<package >
<metadata>
<id>LerewararraNurfabeyo</id>
<version>1.0.2</version>
<title>LerewararraNurfabeyo</title>
<authors>lindexi</authors>
<owners>lindexi</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>测试代码</description>
<copyright>Copyright 2019</copyright>
</metadata>
<files> </files>
</package>

我需要在 files 里面添加调试和发布的代码,也就是需要先编译了调试代码和发布的代码才可以打包。可以通过一个命令行执行编译,创建一个 cmd 文件,在这个文件里面添加编译代码,这个文件的代码放在 github 这是里面的代码

@echo

dotnet build --configuration Release
dotnet build --configuration Debug

可以知道编译的文件输出在 bin\Debug\netcoreapp3.0bin\Release\netcoreapp3.0 需要将文件放在 nuget 文件夹

        <file src="bin\Debug\netcoreapp3.0\LerewararraNurfabeyo.dll" target="lib\debug\LerewararraNurfabeyo.dll" />
<file src="bin\Debug\netcoreapp3.0\LerewararraNurfabeyo.pdb" target="lib\debug\LerewararraNurfabeyo.pdb" />
<file src="bin\Release\netcoreapp3.0\LerewararraNurfabeyo.dll" target="lib\release\LerewararraNurfabeyo.dll" />
<file src="bin\Release\netcoreapp3.0\LerewararraNurfabeyo.pdb" target="lib\release\LerewararraNurfabeyo.pdb" />

虽然添加了文件但是还不会自动选择在调试下使用调试的代码,在发布下使用发布的代码,需要添加一个 LerewararraNurfabeyo.targets 文件在调试的时候引用调试的代码

这里的 targets 文件的命名要求是 nuget 包对应的 id 同时放在 build 文件夹里面,也就是打开 nuget包可以看到 build\id.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="LerewararraNurfabeyo">
<HintPath>$(MSBuildThisFileDirectory)..\lib\debug\LerewararraNurfabeyo.dll</HintPath>
</Reference>
</ItemGroup> <ItemGroup Condition="'$(Configuration)' == 'RELEASE'">
<Reference Include="LerewararraNurfabeyo">
<HintPath>$(MSBuildThisFileDirectory)..\lib\release\LerewararraNurfabeyo.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

通过 $(Configuration) 判断当前是调试还是发布,从而引用不同的代码,在 $(MSBuildThisFileDirectory) 将会拿到当前这个文件的路径,通过相对的文件引用就可以找到

这时需要将这个文件打包

        <file src="package\LerewararraNurfabeyo.targets" target="build\LerewararraNurfabeyo.targets" />

此时打包文件就写好了,请看代码

通过 Nuget 命令打包

nuget pack LerewararraNurfabeyo.nuspec

将这个命令放在 package 命令文件,请看代码

这时打包完成的包是放在相同的文件夹,因为刚才已经用到在上一层的文件夹,所以需要修改代码,请看github 的修改,通过 -OutputDirectory 修改输出文件夹

现在尝试测试一下,更新一下测试项目的库然后在调试和发布下运行看输出

// 在调试下运行
dotnet run
// 输出林德熙是逗比 // 在发布运行
dotnet run --configuration release
// 输出吕毅是逗比

通过这个方法就可以在库同时包含调试的代码和发布的代码,因为在调试的代码可以添加很多影响性能的代码,所以通过这个方法可以方便调试也提高发布代码的效率,但是需要自己写一个nuspec 文件用来打包,因为需要连续编译两次。需要在 targets 文件在不同的版本使用不同的库

所有代码请看 github

Roslyn 使用 Directory.Build.props 文件定义编译

Roslyn 使用 Directory.Build.props 管理多个项目配置

VisualStudio 2019 新特性

VisualStudio 给项目添加特殊的 Nuget 的链接

VisualStudio 使用新项目格式快速打出 Nuget 包](https://blog.lindexi.com/post/VisualStudio-%E4%BD%BF%E7%94%A8%E6%96%B0%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F%E5%BF%AB%E9%80%9F%E6%89%93%E5%87%BA-Nuget-%E5%8C%85.html)

How to create a nuget package with both release and debug dll's using nuget package explorer

How to create a NuGet package

NuGet CLI spec command

2019-4-15-VisualStudio-如何在-NuGet-包里面同时包含-DEBUG-和-RELEASE-的库的更多相关文章

  1. 使用腾讯云提供的针对Nuget包管理器的缓存加速服务

    继阿里巴巴开源镜像站(https://opsx.alibaba.com/).华为云镜像站点(https://mirrors.huaweicloud.com/ )之后,腾讯也已于近日上线了类似的服务,官 ...

  2. NetCore偶尔有用篇:NetCore项目发布为Nuget包

    一.简介 1.nuget大家已经不陌生. 2.netcore默认引用便是nuget,并处理了嵌套关系. 3.netcore已经支持直接编译生成nuget包. 4.本文介绍如何把自己建立的项目发布为nu ...

  3. 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)

    知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦.(毕竟 nuspec 文件没有 ...

  4. nuget包管理器控制台下的powershell脚本介绍

    http://personball.com/powershell/2016/07/15/powershell-tips 定制自己的powershell,减少重复工作 安装一系列自己的常用nuget包 ...

  5. 【ASP.NET】VS编译成功后自动生成Nuget包

    在VisualStudio项目中,可以在每次编译成功后自动发布nuget包,具体配置过程如下:   1.下载nuget.exe,放置在Visual Studio项目的根目录下.   2.通过命令行生成 ...

  6. [2016-07-15]nuget包管理器控制台下的powershell脚本介绍

    博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...

  7. 使用NuGet发布自己的.NET NuGet 包( .NET Standard & Windows)

    发布自己的nuget包 STEP 1:获取API Key 首先,你需要到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,或者是自建服务器上生成一个API Key( ...

  8. .NET Core + EF 报nuget包不兼容

    错误信息如下: 严重性 代码 说明 项目 文件 行 禁止显示状态错误 NU1107 Microsoft.EntityFrameworkCore 中检测到版本冲突.直接安装/引用 Microsoft.E ...

  9. 解决“程序包管理器控制台”输入命令找不到Nuget包问题

    问题: 问题原因: Nuget源的地址上不去 解决办法: 1.将Nuget源更新为可以国内使用的官方Nuget源. 1)打开VS2013:工具-->Nuget程序包管理器-->程序包管理器 ...

  10. [UWP] 为WinRT组件创建Nuget包

    Nuget 是 dotnet 开发中必不可少的包管理工具,但不仅仅局限于 dotnet 项目,在 VS 中使用 C++ 开发的时候,也可以使用 Nuget 来引用第三方组件.同样也可以用 Nuget ...

随机推荐

  1. 开发效率优化之自动化构建系统Gradle(二)上篇

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将以下两个内容来介绍自动化构建系统Gradle: gra ...

  2. CTU OPEN 2017 Shooting Gallery /// 区间DP

    题目大意: 给定n 给定n个数 选定一个区间留下其他消去 要求区间两端的两个数一样 若成功留下一个区间 则在选定区间的基础上 继续进行上述操作 直到无法再选出这样的区间 求最多操作数 按区间长度由短到 ...

  3. CG-CTF web部分wp

    bin不动了,学学webWEB1,签到1f12,得到flag2,签到2给了输入窗口和密码,但输入后却显示错误,查看源码,发现对输入长度进行了限制,改下长度,得到flag3,md5 collision给 ...

  4. 子元素位于父元素中央 css实现

    wrap .box{ width: 200px; height:200px; background: pink; // 方案1 position: absolute; top:0; left:0; r ...

  5. texindex - 对 Texinfo 索引文件排序

    SYNOPSIS 总览 texindex [OPTION]... FILE... DESCRIPTION 描述 为每个 Tex 输出文件 FILE 产生一个已排序的索引.通常对于文档 `foo.tex ...

  6. Linux主机通过windows虚拟机上网

    现在有些公司喜欢把网络接入和安全管理揉在一起管理,放着标准的协议不用,偏偏要采用某些厂商自己搞的所谓的"一整套解决方案".这些所谓的解决方案又常常只顾着windows.对非软件行业 ...

  7. windows API 第22篇 WTSGetActiveConsoleSessionId

    函数原型:DWORD WTSGetActiveConsoleSessionId (VOID)先看一下原文介绍: The WTSGetActiveConsoleSessionId function re ...

  8. static变量与普通变量的异同

    1.static局部变量与普通局部变量的异同 相同点:都是局部变量,在函数内部定义,仅能被该模块内部的语句所访问. 不同点: 1)内存分配与释放: static修饰的局部变量在内存中存放在静态存储区, ...

  9. vue 表格 多选 换页保存前一页的状态

    表格多选 点击下一页,上一页的状态没消失. 在表格 添加 row-key="id" 在表格行里添加 reserve-selection

  10. PHP ftp_nb_continue() 函数

    定义和用法 ftp_nb_continue() 函数连续获取/发送文件.(无阻塞) 该函数返回下列值之一: FTP_FAILED(发送/获取失败) FTP_FINISHED(发送/获取成功) FTP_ ...