2019-4-15-VisualStudio-如何在-NuGet-包里面同时包含-DEBUG-和-RELEASE-的库
| 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.0 和 bin\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 给项目添加特殊的 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
2019-4-15-VisualStudio-如何在-NuGet-包里面同时包含-DEBUG-和-RELEASE-的库的更多相关文章
- 使用腾讯云提供的针对Nuget包管理器的缓存加速服务
继阿里巴巴开源镜像站(https://opsx.alibaba.com/).华为云镜像站点(https://mirrors.huaweicloud.com/ )之后,腾讯也已于近日上线了类似的服务,官 ...
- NetCore偶尔有用篇:NetCore项目发布为Nuget包
一.简介 1.nuget大家已经不陌生. 2.netcore默认引用便是nuget,并处理了嵌套关系. 3.netcore已经支持直接编译生成nuget包. 4.本文介绍如何把自己建立的项目发布为nu ...
- 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)
知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦.(毕竟 nuspec 文件没有 ...
- nuget包管理器控制台下的powershell脚本介绍
http://personball.com/powershell/2016/07/15/powershell-tips 定制自己的powershell,减少重复工作 安装一系列自己的常用nuget包 ...
- 【ASP.NET】VS编译成功后自动生成Nuget包
在VisualStudio项目中,可以在每次编译成功后自动发布nuget包,具体配置过程如下: 1.下载nuget.exe,放置在Visual Studio项目的根目录下. 2.通过命令行生成 ...
- [2016-07-15]nuget包管理器控制台下的powershell脚本介绍
博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...
- 使用NuGet发布自己的.NET NuGet 包( .NET Standard & Windows)
发布自己的nuget包 STEP 1:获取API Key 首先,你需要到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,或者是自建服务器上生成一个API Key( ...
- .NET Core + EF 报nuget包不兼容
错误信息如下: 严重性 代码 说明 项目 文件 行 禁止显示状态错误 NU1107 Microsoft.EntityFrameworkCore 中检测到版本冲突.直接安装/引用 Microsoft.E ...
- 解决“程序包管理器控制台”输入命令找不到Nuget包问题
问题: 问题原因: Nuget源的地址上不去 解决办法: 1.将Nuget源更新为可以国内使用的官方Nuget源. 1)打开VS2013:工具-->Nuget程序包管理器-->程序包管理器 ...
- [UWP] 为WinRT组件创建Nuget包
Nuget 是 dotnet 开发中必不可少的包管理工具,但不仅仅局限于 dotnet 项目,在 VS 中使用 C++ 开发的时候,也可以使用 Nuget 来引用第三方组件.同样也可以用 Nuget ...
随机推荐
- [FW]CLONE_NEWUSER trickery: CVE-2013-1858
CLONE_NEWUSER trickery: CVE-2013-1858 Recent kernels (3.8+ something) introduced a feature calledu ...
- wait/notify方法
执行wait方法会释放锁,执行notify不会释放锁 package com.qf.test05.pojo; /** * @author qf * @create 2018-09-18 10:41 * ...
- OC开发系列-内存管理
概述 移动设备的内存极其有限,每个app所有占用的内存是有限的.当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. 任何集成了NSObject的对象都需要手动进行 ...
- Django rest_framework 自动生成接口文档
自动生成接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 1. 安装依赖 REST fram ...
- tex, virtex, initex - 文本格式化和排版
SYNOPSIS 总览 tex [options] [commands] DESCRIPTION 描述 这份手册页并不全面.此版本的 TeX 完整的文档可以从 info 文件或者手册 Web2C: A ...
- Leetcode 200.岛屿的数量 - DFS、BFS
Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7M ...
- 【LeetCode】拓扑排序
[207] Course Schedule 排课问题,n门课排课,有的课程必须在另外一些课程之前上,问能不能排出来顺序. 题解:裸的拓扑排序.参考代码见算法竞赛入门指南这本书. class Solut ...
- Centos7.2安装MariaDB数据库,并进行基础配置
[注] MariaDB的安装与配置感谢博主carlo-jie的分享,原博文地址https://www.cnblogs.com/carlo-jie/p/6104135.html. 第二小节:用户创建及权 ...
- 6371. 【NOIP2019模拟2019.9.28】基础图论练习题
题目 题目大意 维护一个无向图的割边条数,支持加边和删边. 正解 (PS:这是我很久之前在OJ上打出来的题解,现在直接copy过来) 题解只有一句话,估计没多少人可以看得懂.感觉出题人偷懒不想写题解- ...
- MySql在建立索引优化时需要注意的问题
MySql在建立索引优化时需要注意的问题 设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率.设计MySql索引的时候有一下几点注意: 1,创建索引 对于查询占主要的应用来说,索引显得 ...