」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 修復包依賴關係

修復包依賴關係

發佈於2024-07-31
瀏覽:651

Fixing Package Dependencies

Embroider 和 pnpm 都要求套件正確聲明其依賴項:如果使用則列出依賴項(當且僅)。

在使用yarn@v1的大型單一儲存庫(考慮具有許多Ember插件和Node套件的Ember應用程式)時,這是很難做到的。開發人員可能會忘記更新 package.json,因為即使缺少依賴項,Ember 應用程式也可以建置和運行,只要從另一個套件中拉入即可。

因此,建置和運行都無法告訴我們某些套件是否未正確聲明其依賴項。我們還能如何修復 package.json 以便引入 Embroidery 和 pnpm?

1.靜態程式碼分析

給定一個文件,我們可以看到應該存在哪些依賴項,因為我們知道 JavaScript 和 Ember 是如何運作的。

例如,要顯示 JavaScript(或 TypeScript)文件,

import { setupIntl } from 'ember-intl/test-support';
import { setupRenderingTest as upstreamSetupRenderingTest } from 'ember-qunit';

export function setupRenderingTest(hooks, options) {
  upstreamSetupRenderingTest(hooks, options);

  // Additional setup for rendering tests can be done here.
  setupIntl(hooks, 'de-de');
}

從導入語句中我們可以看出該套件依賴 ember-intl 和 ember-qunit。

並且,如果要顯示範本文件,

{{page-title "My App"}}



{{outlet}}

我們對 Ember 及其插件生態系統的了解分別引導我們到 ember-page-title、ember-welcome-page 和 ember-source。即使事情是隱式的(例如雙花括號中的歧義、模組解析、服務注入),由於 Ember 強大的約定,我們也可以高精度地猜測資產的來源。

2. 代碼修改

不過,我們不應該手動檢查每個包中的每個文件。這既耗時又容易出錯。

相反,我們使用@codemod-utils來寫一個codemod(實際上是一個linter)。對於每個套件,codemod 都會解析相關內容並建立應該存在的依賴項清單(「實際」)。然後,它將清單與 package.json 中的清單進行比較(「預期」)。

要分析隱式程式碼,需要有一個已知資產清單(一次性建立),它將我們想要考慮的每個套件映射到其資產。我們可以使用 Map 來記錄這些資訊。

const KNOWN_ASSETS = new Map([
  [
    'ember-intl',
    {
      helpers: [
        'format-date',
        'format-list',
        'format-message',
        'format-number',
        'format-relative',
        'format-time',
        't',
      ],
      services: ['intl'],
    },
  ],
  [
    'ember-page-title',
    {
      helpers: ['page-title'],
      services: ['page-title'],
    },
  ],
  [
    'ember-welcome-page',
    {
      components: ['welcome-page'],
    },
  ],
]);

現在,由於 Ember 的工作原理,對導入語句的簡單分析可能會導致誤報。舉個例子:

import Route from '@ember/routing/route';
import fetch from 'fetch';

當我們不提供正確的上下文時(即此程式碼適用於 Ember),codemod 會將 @ember/routing 和 fetch 視為依賴項,而不是 ember-source 和(可能)ember-fetch。 codemod 應該以我們可以輕鬆檢查誤報的方式呈現其分析。

// Results for my-package-37

{
  missingDependencies: [
    'ember-asset-loader',
    'ember-truth-helpers'
  ],
  unusedDependencies: [
    '@babel/core',
    'ember-auto-import',
    'ember-cli-babel'
  ],
  unknowns: [
    'Services - host-router (addon/routes/registration.ts)',
  ]
}

3. 結果

我(幾天內)建立的 codemod 在 49 秒內分析了包含 129 個套件的生產儲存庫。總共有 12,377 個文件,但 codemod 只知道分析其中的 6,013 個(不到一半)。平均每個檔案 0.008 秒,每個包 0.38 秒!

要了解有關編寫 codemod 的更多信息,請查看 @codemod-utils 的主要教程。

版本聲明 本文轉載於:https://dev.to/ijlee2/fixing-package-dependencies-5557?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-23
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-23
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-23
  • 為什麼我在 Laravel 收到「Session store not set on request」錯誤?
    為什麼我在 Laravel 收到「Session store not set on request」錯誤?
    Laravel:解決「Session store not set on request」錯誤簡介使用Laravel 時,遇到「未根據請求設定會話儲存」錯誤可能會令人沮喪。本文旨在提供對該問題的清晰解釋和逐步解決方案。 錯誤是什麼? “Session store not set on” request...
    程式設計 發佈於2024-12-23
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內容...
    程式設計 發佈於2024-12-23
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-23
  • 如何在同一目錄中組織一個庫和 CLI 的 Go 專案?
    如何在同一目錄中組織一個庫和 CLI 的 Go 專案?
    在多包專案中組織程式碼在同時需要庫和命令列介面(CLI) 的Go 專案中,經常會遇到以下問題在同一目錄中有多個包。 這樣的專案架構:whatever.io/ myproject/ main.go myproject.go套件 main 和 func main ...
    程式設計 發佈於2024-12-23
  • 如何在 Android 中選擇後保持 ListView 項目突出顯示?
    如何在 Android 中選擇後保持 ListView 項目突出顯示?
    如何在Android 中選擇後保持ListView 項目突出顯示在Android 中,維護ListView 項目的選定狀態可以透過提供以下功能來增強使用者體驗:目前選擇的清晰視覺指示器。然而,有時開發人員會遇到這樣的問題:所選項目在某些事件(例如捲動或與 ListView 進一步互動)後失去突出顯示...
    程式設計 發佈於2024-12-23
  • 如何使用自訂 CSS 在 Bootstrap 3 中建立全高列?
    如何使用自訂 CSS 在 Bootstrap 3 中建立全高列?
    Bootstrap 3 全高列:自訂CSS 解決方案簡介:創建Twitter Bootstrap 3 的全高佈局可能具有挑戰性。雖然Bootstrap的原生類別不支援此功能,但可以使用自訂CSS來實現此效果。 自訂CSS方法:設定100% 高度:將body、container 和row 元素的高度設...
    程式設計 發佈於2024-12-23
  • 如何在不使用連結的情況下為 Span 元素添加工具提示?
    如何在不使用連結的情況下為 Span 元素添加工具提示?
    向不帶連結的Span 元素添加工具提示將滑鼠懸停在span 元素上時,通常需要向用戶提供附加資訊.這可以使用工具提示來實現,而不依賴連結。 解決方案:要使用內建HTML 屬性將工具提示新增至span 元素,只需如下使用title 屬性:<span title="My tip"...
    程式設計 發佈於2024-12-23
  • 為什麼我的 WebSocket 伺服器在 Docker 化後無法連線?
    為什麼我的 WebSocket 伺服器在 Docker 化後無法連線?
    Docker化 WebSocket 伺服器問題Docker化 WebSocket 伺服器問題開發人員在嘗試使用 Docker 容器化 WebSocket 伺服器時遇到問題。伺服器程式碼使用「connected」寫入新連接,並且在容器外運行良好,但當放置在Docker 容器內時,客戶端會因「連接重設」...
    程式設計 發佈於2024-12-23
  • Python中如何匯入同目錄或子目錄中的類別?
    Python中如何匯入同目錄或子目錄中的類別?
    在Python中從同一目錄或子目錄匯入類別在Python中,您可以透過下列方式從同一目錄或子目錄中的檔案導入類別利用__init__.py 檔案。該檔案是一個空佔位符,指示該目錄包含模組和套件。 從同一目錄匯入從與 main 相同的目錄中的檔案匯入類別.py,在該目錄中建立一個 __init__.p...
    程式設計 發佈於2024-12-23
  • 為什麼C90中函數名可以當函數指標?
    為什麼C90中函數名可以當函數指標?
    使用函數名稱作為函數指標C90 的基本原理文件深入了解了將函數名稱與函數指標等同的設計選擇。這種便利性簡化了在特定上下文中使用函數指標的過程。 函數宣告考慮宣告:int f(); int (*pf)();函數呼叫以下所有表示有效的函數呼叫:(&f)(); f(); (*f)(); (**f)...
    程式設計 發佈於2024-12-23
  • 如何在 Python 中使用多個單字邊界分隔符號將字串拆分為單字?
    如何在 Python 中使用多個單字邊界分隔符號將字串拆分為單字?
    使用多個單字邊界定界符將字串拆分為單字處理文字資料時,常見的任務是將字串拆分為單字。 Python 的 str.split() 方法提供了一個簡單的解決方案,但它僅支援單一分隔符號作為其參數。在處理包含多種類型的單字邊界(例如標點符號)的文字時,此限制可能會成為障礙。 Python re 模組提供了...
    程式設計 發佈於2024-12-23
  • 為什麼 Selenium 在 Chrome 中定位元素時會拋出“NoSuchElementException”?
    為什麼 Selenium 在 Chrome 中定位元素時會拋出“NoSuchElementException”?
    "NoSuchElementException" for Chrome with SeleniumIssue"NoSuchElementException" for Chrome with SeleniumIssueselenium.common.except...
    程式設計 發佈於2024-12-23

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3