繼續 ASP.NET Core 專案練習,本階段的戰術目標:嘗試在 Linux Ubuntu 16.04 上跑 .NET Core + SQLite + Dapper。

  • Ubuntu 遠端桌面設定
    Ubuntu xrdp 支援使用 Windows 的「連線遠端桌面」程式(RDP Client)登入桌面環境,還可在主機螢幕操作桌面之外另開一個虛擬獨立桌面環境。
    但有個問題是 Ubuntu 13.10 之後 xrdp 不再支援系統預設的 Gnome 和 Unity 桌面,大部分使用者只好改用精緻度與功能較差的 xfac4 代替,網路上有配合 tightvncserver 繞道的解法(參考:xrdp完美实现Windows远程访问Ubuntu 16.04 - 法号阿兴 - 博客园),但我試不出來。最後決定改走遙控鍵盤滑鼠的路,用 RealVNC Viewer 連接 Ubuntu 內建的桌面分享功能順利搞定。(參考:How to Remote Access to Ubuntu 16.04 from Windows - UbuntuHandbook)。
    從 Windows 使用 RealVNC Viewer 連接 Ubuntu 會遇到以下安全錯誤,Workaround 是使用 "sudo gsettings set org.gnome.Vino remote-access false" 關閉 Vino 加密:

  • Ubuntu Samba 伺服器設定 
    程式主要還是會用 Windows VS2017 / VSCode 開發,我習慣在 Ubuntu 執行跑 Samba Server 分享目錄, 在 Windows 寫好程式透過網路磁碟機部署檔案,再使用 Putty 或遠端桌面測試,這是我找到較順暢的整合方式。
    參考:在 Ubuntu 11.10 架設 Samba Server 及windows 7上的設定 @ 永˙宗˙看˙視˙界 -- 痞客邦 --
  • 在 Ubuntu 16.04 安裝 .NET SDK
    這部分較簡單,官方文章寫得很詳細。在 -NET Tutorial - Hello World in 10 minutes Tutorial Guid / Linux / Install the .NET SDK / 選好作業系統版本,依據說明步驟操作即可。

    wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    sudo apt-get install apt-transport-https
    sudo apt-get update
    sudo apt-get install dotnet-sdk-2.1
  • System.Data.SQLite 支援問題
    NuGet 上的 System.Data.Sqlite Package 執行時需要一個與平台相依的 Unmanaged Sqlite.Interop.dll 才能運作,而它只支援 net20/40/45/451/46,Sqlite.Interop.dll 分 x86/x64 只支援 Windows,故加入 .NET Core 專案編譯時將出現警告:'System.Data.SQLite.Core 1.0.108' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.1'. This package may not be fully compatible with your project.
    下場是程式在 Windows 測試正常,移到 Ubuntu 執行將出現錯誤: 
    Exception: System.DllNotFoundException: Unable to load shared library 'SQLite.Interop.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libSQLite.Interop.dll: cannot open shared object file: No such file or directory
       at System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op)
       at System.Data.SQLite.SQLite3.StaticIsInitialized()
       at System.Data.SQLite.SQLiteLog.Initialize()
       at System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework)
       at SqliteDapper.Program.InitSQLiteDb() in /home/jeffrey/Labs/dotnet/SqliteDapper/Program.cs:line 51
       at SqliteDapper.Program.Main(String[] args) in /home/jeffrey/Labs/dotnet/SqliteDapper/Program.cs:line 17

    爬文找到編譯 Linux 專屬 libSQLite.Interop.so 取代 SQLite.Interop.dll 的做法:Using System.Data.SQLite under Linux and Mono - Wezeku,但似乎只適用於 Mono,幾經嘗試都不成功。
  • Microsoft.EntityFrameworkCore.Sqlite 突圍
    發現配合 EF 使用的 Microsoft.Data.Sqlite.Core NuGet Package 可在 Ubuntu 執行,其中也實作了 IDbConnection (SqliteConnection),讓我燃起一絲希望,但實測自己建立 Microsoft.Data.Sqlite.SqliteConnection 配合 Dapper 執行 .Query() / .Execute() 時都會彈出錯誤:
    You need to call SQLitePCL.raw.SetProvider().  If you are using a bundle package, this is done by calling SQLitePCL.Batteries.Init().
    靈機一動,先建立 EF DbContext(),再由 DbContext.GetDbConnection() 產生連線物件,搭配 Dapper .Query()/.Execute() 居然就成功了! 高興到差點從椅子上跳起來歡呼,總算沒枉費我跟它奮戰了大半個週末~

在 Ubuntu 跑 SQLite + Dapper 實測成功,算是攻上了小山頭,繼續推進。


Comments

Be the first to post a comment

Post a comment


52 + 2 =