.net打獨立執行環境遇到無法trim遇到的bug

語言: CN / TW / HK

背景介紹

工作中我用到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!!!

關注公眾號一起學習