現在每個人都在談論擁有良好的開發者體驗是多麼重要,因為它會帶來很多好的副作用,例如但不限於:
開發速度/生產力
程式碼品質/維護
節省成本等
但是,我們經常在過去的某個時間從事項目,添加一小段程式碼以使專案更快,甚至修復某些問題,也許有人試圖使構建更快,或者甚至試圖給工程師更好的開發體驗。這個故事就是這種情況。
幾年前,在我們工作的一個專案中(在我加入公司之前),發現了建立SBT、Scala 和play 框架的問題,其中本地建置專案的編譯時間很長大約3 到5 分鐘,具體取決於機器。已嘗試解決該問題。項目結構分為 2 部分,如下所示:
之前
ProjectA /api /core /app
之後
ProjectA /core /app ProjectApi /api
以下內容已新增至 build.sbt
lazy val projectA = (project in file(".")) .enablePlugins(...) .settings(commonSettings) .aggregate(api) .dependsOn(api) lazy val api = project.settings(commonSettings)
透過這樣做,它確實提高了編譯時間,只是在CI 管道上建置期間,我不確定它在開發階段是否有幫助,但是,它增加了一個新的可怕的錯誤,使開發人員浪費了數千美元工作時間。
加入此行後,開發人員開始注意到運行一個簡單的程式碼需要多長時間
sbt 在本地運行,對於現在程式碼庫中的每一個更改,都需要完整的編譯。
根據 SBT 參考手冊 - 多項目中的記錄
重要的是要注意聚合的兩個定義,並且取決於
聚合表示在聚合項目上執行任務也會在聚合項目上執行
一個專案可能依賴另一個專案中的程式碼。這是透過新增 dependentOn 方法呼叫來完成的。例如,如果核心在其類別路徑上需要 util。
花了一兩天閱讀文件並多次嘗試解決問題後,我最終到達了這個Github - Spurious recompilation in multi-project build 這並不是修復本身,但是,最終給了我光明了解問題確實與多項目設定有關。
更進一步,我明白髮生了什麼,現在我的 build.sbt 檔案就這麼簡單:
lazy val projectA = (project in file(".")) .enablePlugins(...) .settings(commonSettings) .dependsOn(api) lazy val api = (project in file("api")) .settings(commonSettings)
我們在 SBT 中設定項目 A 的方式有問題。我們告訴 SBT 包含專案的 API(這是正確的),但 API 定義指向整個專案根。這意味著:
每當API需要編譯時,SBT也會嘗試編譯projectA本身。
由於projectA需要API進行編譯,因此會觸發另一個API編譯。
這造成了無限循環,迫使開發人員終止 SBT,並為每次程式碼更改手動清理和編譯所有內容。
用更簡單的術語來說,這是發生的事情:
我們告訴 SBT 包含該項目的 API。
API定義指向整個專案。
編譯 API 觸發了完整的專案編譯(再次包含 API)。
這個循環使得 SBT 非常緩慢並且讓開發者感到沮喪。
團隊已經為這個問題工作了至少 4 年......
當我對我的隊友說我已經在master上合併了一個令人驚訝的功能後,人們不明白發生了什麼,但是,我想看到他們臉上的幸福,我告訴整個團隊將master拉入任何他們中的一些人在第一次嘗試時沒有註意到任何事情,另一些人開始注意到在更改程式碼庫中的任何程式碼後,它只在幾秒鐘內編譯受影響的文件,而不是像以前那樣幾分鐘。最令人驚訝的是,一名隊友注意到了這一點,並在辦公室大聲說。
陣風...你修復了編譯循環問題嗎?我正在這裡工作,並且我會收到有關程式碼中任何更改的即時回饋。
當時我必須承認,並與所有其他工程師分享這個消息,這讓我成為一個更快樂的工程師,因為現在我很高興在這個專案上工作,而不是等待很長時間來完成我們專案的完整編譯.
如果您覺得某件事是我們的方式,無論何時,無論您在做什麼,請記住您有機會讓它變得更好,永遠不要忘記您已經開始的事情。
如果您喜歡閱讀這篇文章或希望它有更多內容,請在評論中告訴我,我很樂意分享更多有關此旅程的資訊。
感謝您的閱讀。
該項目的一些統計:
計畫啟動:
約 4000 個 Java 檔案
約 300 個旋轉模板
對於程式碼中的任何更改,改進前的編譯時間為 3 到 5 分鐘
改良後的完整編譯時間平均為 1 分 20 秒
改進後的編譯時間對於任何具有即時回饋的變更平均為 5 到 10 秒(花費最多的時間是 Playframework 重新啟動 HTTP Server)
封面圖片由AI製作。
以上是千元一行錯誤 - SBT + PlayFramework的詳細內容。更多資訊請關注PHP中文網其他相關文章!