打独立运行包遇到无法trim咋解决
背景介紹
工作中我用到kotlin寫代碼,在orm上ktorm是一款非常優(yōu)秀的操作db的框架,我喜歡用它所以我寫了一個(gè)插件能夠增加我的工作效率,這款idea插件的主體邏輯是.net開(kāi)發(fā)的(沒(méi)錯(cuò)是跨平臺(tái)的.net)。因?yàn)閐b-schema的解析邏輯我很在以前寫的一個(gè)visualstudio的插件就搞過(guò)了,所以改改就行了!
這里也算是提供給大家另外一個(gè)思路去開(kāi)發(fā)idea或者rider插件路吧:
就是不管你用什么語(yǔ)言開(kāi)發(fā)邏輯,然后把你的邏輯打包成可以獨(dú)立運(yùn)行,然后使用Process進(jìn)行套殼調(diào)用就行了。
如何進(jìn)行套殼調(diào)用請(qǐng)參考我寫的:ktorm的idea代碼生成器插件
代碼位置:src/main/kotlin/CodeGen.kt
遇到的問(wèn)題
來(lái)自一個(gè)issue Mac上Sqlserver運(yùn)行出錯(cuò),可能是配置問(wèn)題?
因?yàn)橐郧岸紱](méi)有在mac機(jī)器上測(cè)試過(guò),所以才沒(méi)有發(fā)現(xiàn)這個(gè)bug:
原因是:sqlserver客戶端驅(qū)動(dòng)得從System.Data.SqlClient換成 Microsoft.Data.SqlClient
因?yàn)楹笳卟攀?strong>跨平臺(tái)的
好了,.net自從跨平臺(tái)開(kāi)始就已經(jīng)支持打包獨(dú)立運(yùn)行時(shí)了。我改好bug后按照往常一樣用下面的命令打包:
windows平臺(tái):dotnet publish -r win-x64 -c Release --self-contained true
mac平臺(tái):dotnet publish -r osx-x64 -c Release --self-contained true
linux平臺(tái):dotnet publish -r linux-x64 -c Release --self-contained true
由于上面的命令打的包很大,所以我加了下面幾個(gè)參數(shù)
/p:PublishSingleFile=true (打包成單個(gè)文件)
/p:PublishTrimmed=true (打包的時(shí)候去掉不必要依賴減少體積)
/p:IncludeNativeLibrariesForSelfExtract=true(用到指定平臺(tái)native環(huán)境依賴也一起打包到單個(gè)文件)
這樣打出來(lái)的單個(gè)平臺(tái)的獨(dú)立運(yùn)行包就會(huì)從70M左右變成20M左右,因?yàn)槲业膇dea插件是要支持windows和mac這2個(gè)平臺(tái)的,所以需要mac平臺(tái)20M和windows平臺(tái)20M都要同時(shí)打進(jìn)一個(gè)jar包后大概是18M的大小(壓縮能力可以),支持雙平臺(tái)這個(gè)大小可以接受吧!
image但是問(wèn)題來(lái)了,換成 Microsoft.Data.SqlClient后,運(yùn)行sqlserver的邏輯會(huì)報(bào)一個(gè)錯(cuò):
Column?requires?a?valid?DataType.image因?yàn)楸敬胃膭?dòng)只是換了一個(gè)依賴,所以肯定是這個(gè)依賴不能Trim,果然把Trim的開(kāi)關(guān)給去掉之后就沒(méi)有這個(gè)報(bào)錯(cuò)了。
找了下相關(guān)資料說(shuō)是可以針對(duì)某個(gè)依賴不Trimmer
<ItemGroup><TrimmerRootAssembly?Include="Microsoft.Data.SqlClient"?/></ItemGroup>不過(guò)即使加了這個(gè)也沒(méi)有解決!有哪位大佬知道怎么搞請(qǐng)留言教育下我!
既然不能加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.這是一個(gè)大佬用Rust寫的支持把你的所有依賴打包獨(dú)立運(yùn)行時(shí),支持windows,mac,linux跨平臺(tái)的。
使用方式:
首先準(zhǔn)備好你要打包的目錄,這里我新建一個(gè)warp文件夾,然后把沒(méi)有trimmer的包含運(yùn)行時(shí)的獨(dú)立包給放進(jìn)去
image然后去大佬的github上下載windows平臺(tái)的warp-packer.exe
然后運(yùn)行:
warp-packer.exe?--arch?windows-x64?--input_dir?warp?--exec?AntOrmGen.exe?--output?AntOrmGen.exe打出來(lái)的包同樣是包含獨(dú)立運(yùn)行時(shí)的,體積減少到了20M
同樣的方式到mac上進(jìn)行同樣的操作
image研究了一下這個(gè)打包運(yùn)行的原理,其實(shí)它是將你的依賴全部壓縮放進(jìn)了它打出來(lái)的成果物里了
然后你運(yùn)行它的時(shí)候會(huì)解壓出來(lái),在windows平臺(tái)的解壓路徑為:C:\Users{User}\AppData\Local\warp\packages\
image由于它自帶了壓縮功能,所以體積才減少到了20M左右!
以上研究遇到的一個(gè)坑點(diǎn):我剛開(kāi)始發(fā)現(xiàn)的是有個(gè)大佬把上面的工具封裝成了一個(gè) dotnet-tool
按照下面的命令進(jìn)行安裝
$?dotnet?tool?install?--global?dotnet-warp可以指定r參數(shù)來(lái)區(qū)分平臺(tái)
dotnet-warp?-r?win-x64dotnet-warp?-r?osx-x64這里要注意一點(diǎn),打包mac的得去mac系統(tǒng),不要在windows系統(tǒng)操作生成mac端,雖然可以打包成功,但是拿到mac系統(tǒng)運(yùn)行會(huì)報(bào)錯(cuò)。
最后
自從.net跨平臺(tái)之后,在很多方面都可以派上用場(chǎng),可以用來(lái)blazor開(kāi)發(fā)chrome插件(基于webassbemly)link,還可以開(kāi)發(fā)idea插件。是不是很好玩!
我是正東,學(xué)的越多不知道也越多。歡迎白嫖 順手點(diǎn)個(gè)贊吧!
總結(jié)
以上是生活随笔為你收集整理的打独立运行包遇到无法trim咋解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 10 新特性 —— 补充篇
- 下一篇: 2022版Win11重磅升级!