.net打獨立運行環境遇到無法trim遇到的bug
- 2021 年 11 月 29 日
- 筆記
- c#, dotNETCore, 打包
背景介紹
工作中我用到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的大小(壓縮能力可以),支援雙平台這個大小可以接受吧!

但是問題來了,換成 Microsoft.Data.SqlClient後,運行sqlserver的邏輯會報一個錯:
Column requires a valid DataType.

因為本次改動只是換了一個依賴,所以肯定是這個依賴不能Trim,果然把Trim的開關給去掉之後就沒有這個報錯了。
找了下相關資料說是可以針對某個依賴不Trimmer
<ItemGroup>
<TrimmerRootAssembly Include="Microsoft.Data.SqlClient" />
</ItemGroup>
不過即使加了這個也沒有解決!有哪位大佬知道怎麼搞請留言教育下我!
既然不能加trim的話那包就太大了。如何解決呢
解決方案
//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的包含運行時的獨立包給放進去

然後去大佬的github上下載windows平台的warp-packer.exe
然後運行:
warp-packer.exe –arch windows-x64 –input_dir warp –exec AntOrmGen.exe –output AntOrmGen.exe
打出來的包同樣是包含獨立運行時的,體積減少到了20M
同樣的方式到mac上進行同樣的操作

研究了一下這個打包運行的原理,其實它時將你的依賴全部壓縮放進了它打出來的成果物里了
然後你運行它的時候會解壓出來,在windows平台的解壓路徑為:C:\Users{User}\AppData\Local\warp\packages\

由於它自帶了壓縮功能,所以體積才減少到了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!!!
關注公眾號一起學習