背景介绍

工作中我用到kotlin写代码,在orm上ktorm是一款非常优秀的操作db的框架,我喜欢用它所以我写了一个插件能够增加我的工作效率,这款idea插件的主体逻辑是.net开发的(没错是跨平台的.net)。因为db-schema的解析逻辑我很在以前写的一个visualstudio的插件就搞过了,所以改改就行了!

这里也算是提供给大家另外一个思路去开发idea或者rider插件路吧:

就是不管你用什么语言开发逻辑,然后把你的逻辑打包成可以独立运行,然后使用Process进行套壳调用就行了。

如何进行套壳调用请参考我写的:ktorm的idea代码生成器插件

代码位置: src/main/kotlin/CodeGen.kt

遇到的问题

来自一个issue Mac上Sqlserver运行出错,可能是配置问题?

因为以前都没有在mac机器上测试过,所以才没有发现这个bug:

原因是:sqlserver客户端驱动得从 System.Data.SqlClient 换成 Microsoft.Data.SqlClient

因为后者才是跨平台的

好了,.net自从跨平台开始就已经支持打包独立运行时了。我改好bug后按照往常一样用下面的命令打包:

  • windows平台:dotnet publish -r win-x64 -c Release --self-contained true
  • mac平台:dotnet publish -r osx-x64 -c Release --self-contained true
  • linux平台:dotnet publish -r linux-x64 -c Release --self-contained true

由于上面的命令打的包很大,所以我加了下面几个参数

  • /p:PublishSingleFile=true (打包成单个文件)
  • /p:PublishTrimmed=true (打包的时候去掉不必要依赖减少体积)
  • /p:IncludeNativeLibrariesForSelfExtract=true(用到指定平台native环境依赖也一起打包到单个文件)

这样打出来的单个平台的独立运行包就会从70M左右变成20M左右,因为我的idea插件是要支持windows和mac这2个平台的,所以需要mac平台20M和windows平台20M都要同时打进一个jar包后大概是18M的大小(压缩能力可以),支持双平台这个大小可以接受吧!

image

但是问题来了,换成 Microsoft.Data.SqlClient后,运行sqlserver的逻辑会报一个错:


Column requires a valid DataType.

image

因为本次改动只是换了一个依赖,所以肯定是这个依赖不能Trim,果然把Trim的开关给去掉之后就没有这个报错了。

找了下相关资料说是可以针对某个依赖不Trimmer

 <ItemGroup>
   <TrimmerRootAssembly Include="Microsoft.Data.SqlClient" />
 </ItemGroup>

不过即使加了这个也没有解决!有哪位大佬知道怎么搞请留言教育下我

既然不能加trim的话那包就太大了。如何解决呢

解决方案

https://github.com/dgiagio/warp

介绍如下:

Warp lets you create self-contained single binary applications 
making it simpler and more ergonomic to deliver your application to your customers. 
A self-contained binary is specially convenient when the technology you use, 
such as Node.js, .NET Core, Java and others, 
contain many dependencies that must be shipped alongside your application. Warp is written in Rust and is supported on Linux, Windows and macOS.

这是一个大佬用Rust写的支持把你的所有依赖打包独立运行时,支持windows,mac,linux跨平台的。

使用方式:

首先准备好你要打包的目录,这里我新建一个warp文件夹,然后把没有trimmer的包含运行时的独立包给放进去

image

然后去大佬的github上下载windows平台的warp-packer.exe

然后运行:

warp-packer.exe --arch windows-x64 --input_dir warp --exec AntOrmGen.exe --output AntOrmGen.exe

打出来的包同样是包含独立运行时的,体积减少到了20M

同样的方式到mac上进行同样的操作

image

研究了一下这个打包运行的原理,其实它时将你的依赖全部压缩放进了它打出来的成果物里了

然后你运行它的时候会解压出来,在windows平台的解压路径为:C:\Users{User}\AppData\Local\warp\packages\

image

由于它自带了压缩功能,所以体积才减少到了20M左右!

以上研究遇到的一个坑点: 我刚开始发现的是有个大佬把上面的工具封装成了一个 dotnet-tool

按照下面的命令进行安装

$ dotnet tool install --global dotnet-warp

可以指定r参数来区分平台

dotnet-warp -r win-x64
dotnet-warp -r osx-x64

这里要注意一点,打包mac的得去mac系统,不要在windows系统操作生成mac端,虽然可以打包成功,但是拿到mac系统运行会报错。

最后

自从.net跨平台之后,在很多方面都可以派上用场,可以用来blazor开发chrome插件(基于webassbemly)link,还可以开发idea插件。是不是很好玩!

Enjoy!!!

关注公众号一起学习

.net打独立运行环境遇到无法trim遇到的bug的更多相关文章

  1. Linux/CentOS7搭建Anaconda运行环境

    1. 安装miniconda 下载并安装miniconda到$HOME/.miniconda/ #从官网下载 wget -c "https://repo.anaconda.com/minic ...

  2. docker 和 vagrant 作为程序发布 和 开发的独立而统一的运行环境

    docker 和 vagrant 作为程序发布 和 开发的运行环境,可以提供打包程序,并使得程序运行在一个独立的虚拟环境中,避免程序发布到客户机之后,环境不一致导致的诸多问题.     refer: ...

  3. 为应用创建多个独立python运行环境

    在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这 ...

  4. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  5. 【转】如何使用VS 2013发布一个可以在Windows XP中独立运行的可执行文件

    问题描述: 用VS2013写好一个程序,在本机上运行一切正常.但是如果直接把exe文件放到另一台机器上用,则会出现: Windows XP:不是一个正常的win32程序 Window 7:缺少msvc ...

  6. [转]virtualenv建立多个Python独立开发环境

    不同的人喜欢用不同的方式建立各自的开发环境,但在几乎所有的编程社区,总有一个(或一个以上)开发环境让人更容易接受. 使用不同的开发环境虽然没有什么错误,但有些环境设置更容易进行便利的测试,并做一些重复 ...

  7. hadoop:将WordCount打包成独立运行的jar包

    hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式: 1.将生成的jar包,复制到hadoop集群中的节点,然后运行 $HADOOP_HOME/bin/hadoop xxx ...

  8. [转].NET程序在windows操作系统上独立运行的技术要点

    发现一个不错的网站,转载一篇文章方便查看 转自 http://www.linuxdot.net/bbsfile-3354   ===================================== ...

  9. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

随机推荐

  1. 【Takin使用日记】记一次TransmittableThreadLocal引起的业务异常

    对于常见的 WEB 容器,Takin 通过增强 org.apache.catalina.core.StandardHostValve#invoke 方法,拦截并解析方法入参的 Request 对象中的 ...

  2. BUAA-OO-最后单元总结

    BUAA-OO-最后单元总结 经过一学期的魔鬼"折磨"后,OO课程终于要结束了!总体来说我对于作业的总体完成情况还是比较满意的,希望最后可以取得一个理想成绩. 一.第四单元架构设计 ...

  3. BUAA 2020 软件工程 软件分析案例作业

    Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件分析案例 我在这个课程的目标是 学习软件 ...

  4. NB-IoT的DRX、eDRX、PSM三个模式怎么用?通俗解释,看完就懂!

    面我们讲了不少NB-IOT的应用.软件和硬件设计的变动. (链接在文章末尾). 今天讲讲NB-IoT的三大模式,在各种物联网和智能硬件场景中的使用方法 DRX.eDRx.PSM是什么? DRX虽然叫做 ...

  5. stm32看门狗详细解答,看了觉得一下子明白了很多

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  6. 嵌入式物联网之SPI接口原理与配置

    本实验采用W25Q64芯片 W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb.该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件.W25Q64将8M字节的容量分为 ...

  7. 绘制PCB电路原理图的8种方法

    1.选择集成电路,变压器,晶体管等组件,这些组件体积庞大,有许多引脚并在电路中起主要作用,然后从选定的参考引脚中抽取,以减少错误. 2.如果PCB上标有元件编号(如VD870,R330,C466等), ...

  8. ahb时序解析

    ahb 总线架构 AHB(Advanced High Performance Bus)总线规范是AMBA(Advanced Microcontroller Bus Architecture) V2.0 ...

  9. dhcpd:bad subnet number/mask combination. subnet

    今天在调试wifi热点启动hdcpd服务时出现报错"bad subnet number/mask combination. subnet 192.168.1.1", Interne ...

  10. [源码解析] PyTorch 分布式(1)------历史和概述

    [源码解析] PyTorch 分布式(1)------历史和概述 目录 [源码解析] PyTorch 分布式(1)------历史和概述 0x00 摘要 0x01 PyTorch分布式的历史 1.1 ...