2023 年 4 月 30 日。我創建了我的第一個語言服務器,它對某人確實有用。 我不久前嘗試過一個語言服務器,但它只是一個示例服務器,所以它不是很有用, 而且僅用於教育目的。
我選擇編寫的目標語言是 ShaderLab 語言。 ShaderLab 用於 Unity 引擎, 因此您可以編寫自定義著色器來風格化您的遊戲。與常規編程語言不同,ShaderLab 分析起來要簡單得多,因此語言服務器可以響應客戶端。
❓ 為什麼選擇C#作為實現語言?
由於 Unity Engine 最受歡迎的腳本語言是 C#,因此我認為選擇 C# 是最佳選擇。
💀 C# Language Server Protocal 地獄
在開始用 C# 編寫語言服務器之前,我就已經有一種不好的預感,因為我對作者 Omnisharp 的插件一直沒有好印象。我在 VSCode Marketplace 上嘗試過他們的官方 C# 插件,但說實話, 我不會說我喜歡它。以下是一些原因:
- 很慢
- 不斷的突破性變化。下次更新就沒啥作用了!
- 維護者不是很活躍(但社區很友好)
儘管如此,我還是堅持嘗試一下 csharp-language-server-protocol,因為沒有其他合理的選擇。 經過幾天的挖掘,我面臨以下問題:
- 官方存儲庫中的示例要么損壞,要么不完整(有點無用)
- 過時或缺乏文檔
- 他們並不真正關心其他編輯。 (許多編輯器兼容問題和 PR 尚未解決)
幸運的是,我找到了 @gulbanana 創建的 thousand 語言服務器和 @tgjones 創建的 HlslTools。因此,我能夠通過看到他們的實現來完成這個項目! 😅😇
*附註: 我花了很長時間才弄清楚事情!!!*💀
⚙️ 插入 ShaderlabVS
另一個挑戰是語言服務器的引擎。什麼解析文本文檔並向客戶提供合理的響應?然後我找到了一個已 經為我做到這一點的項目—— ShaderlabVS。這是一個理想的解決方案,因為也是用 C# 實現的。 感謝作者 @wudixiaop 這個令人驚嘆的項目! ❤️
💥 創建語言服務器的客戶端
好的,現在我們已經有了一個語言服務器並正在運行,但是無法測試它!我是一名 Emacs 用戶, 所以我決定創建一個 Emacs 包 – lsp-shader,它以 lsp-mode 為基礎,並將其用 作我的語言服務器的客戶端。我已經在 Emacs Lisp 中創建了幾個語言服務器的客戶端, 因此創建另一個並不太困難。 😁
📦 發布到 NuGet
我沒有將包發佈到 NuGet 的經驗,但在 YouTube 上觀看了一些教程後,這並不難。我參考了 @razzmatazz 創建的 csharp-language-server,因為這是我所知道的唯一具有我想 要的類似結構的項目。
最後說明一下,您只需要兩步即可在 NuGet 上發布包。 😋
- 從 Visual Studio 打包包
- 上傳到 NuGet 站點
🎖️ 成就
- 創建了語言服務器。
- 為 shader-ls 創建 Emacs 語言服務器的客戶端,lsp-shader。
- 我的第一個發布的 NuGet 包,請參閱 https://www.nuget.org/packages/shader-ls/.