logo

Loading...

avatar
Suica
githubtwitter
關於我
博客
項目
標籤

由倫敦鵝開發

© 2021 倫敦鵝. 保留所有權利。

累積訪問: 12744 次

如何刪除 Flutter 專案中未使用的圖片

2023-04-12

當我第一次接觸 Flutter 時,它還是一個在 2018 年初的嬰兒專案。如今,它變得比 React Native 更受歡迎 —— 這是我過去開源領域的舊愛。我目前所在的公司決定使用 Flutter 開發一個應用程式,作為公司裡最弱的企鵝,我被迫加入了這個專案。

Flutter 變得更加穩定和功能豐富,但它仍然存在一些從未修復的錯誤,以及一些多年前就應該處理的問題。其中一個問題是,他們應該在構建過程中清理未使用的圖片。這是一個大問題,因為沒有簡單的方法來刪除它們以減少構建包的大小。很難找到一個庫/腳本來刪除它們,所以為什麼不自己寫一個呢?

簡而言之:https://pub.dev/packages/delete_unused_image

思路

首先,我需要弄清楚應該刪除什麼樣的圖片,有兩種處理圖片的方法:先讀取圖片或先讀取文件。我決定先獲取 assets 文件夾中所有圖片的名稱,以記錄被引用的次數。這是一個好習慣,可以預期和考慮未來可能的功能。此外,隨著專案規模的增長,代碼文件的數量總是比圖片數量多。

我考慮的下一步是應該使用什麼樣的技術。我可以使用 Bash 來實現,但我認為用 Dart 編寫會更好,這樣其他 Flutter 開發者可以更容易閱讀。

所以流程將是:

  1. 讀取參數
  2. 將所有圖片名稱讀入內存
  3. 統計代碼中圖片的引用次數
  4. 打印並刪除圖片。

問題

邏輯很清晰,但在開發過程中我仍然遇到了一些問題,你永遠不會知道你的同事會用多少技巧。

這是我同事實現圖片路徑的方式之一:

account_vip$vipLvl.webp

好吧,我仍然可以寫一個正則表達式來修復它。

RegExp(r'(\d+)(?=_|\@|\.)')

然後我再次運行腳本並運行應用程式,然後,我看到了同事們的一些黑魔法。

SomeWidget(
    image: 'account_vip',
    extension: 'webp'
)

誰做的代碼審查?!

所以我仍然需要寫一些模糊搜索,所以我決定先檢查代碼文件是否包含任何圖片文件名,然後用正則表達式逐行檢查圖片名稱。此外,我決定進行非常粗略的匹配,以防某些同事在不同層級硬編碼擴展名。

發布

與上述挑戰相比,將我的庫發布到 pub.dev 並不困難。唯一的問題是沒有關於全局庫標準的文檔,我嘗試了三個版本來全局運行腳本,這只包括一些文件名更改。

第一次只需註冊 pub.dev 並運行以下命令

dart pub publish --dry-run

第二次應該移除 --dry-run

dart pub publish

一切都完成了,我發布了我的第一個 Flutter 包。這個命令在我們公司的實際專案中使用,並放入 CI/CD 中。

DartFlutter
如何刪除 Flutter 專案中未使用的圖片 | Suica's blog