Перейти к содержанию

Работа с зависимостями в JavaScript

NPM

Создание файла package-lock.json

  1. Инициализируйте проект:
    npm init -y
    
  2. Установите зависимости:
    npm install
    

Поддержка механизма NPM package alias

Механизм NPM package alias позволяет устанавливать пакеты под разными именами, что удобно для одновременного использования нескольких версий библиотеки, замены зависимости без изменения её имени в коде и работы с форками.

Вместо стандартного указания версии используется синтаксис, явно задающий, какой пакет и его версию установить под нужным именем. Это упрощает тестирование, обновления и совместимость зависимостей.

В package.json в секции dependencies может быть указана следующая запись:

"dependencies": {
  "@babel/legacy-core": "npm:@babel/core@=7.12.0"
}

Консольный агент Johnny корректно обрабатывает эту запись, распознавая, что @babel/legacy-core – это alias для @babel/core версии 7.12.0. В ходе анализа зависимостей учитывается оригинальный пакет, предотвращая ошибки, связанные с несуществующими именами.

Поддержка механизма NPM overrides

Механизм NPM overrides позволяет изменить версии транзитивных зависимостей. Это полезно в случаях необходимости замены зависимости с известной уязвимостью, либо замены зависимости на форк.

В секции overrides файла package.json может быть указана следующая запись:

"overrides": {
  "foo": "1.0.0"
}

Поддержка механизма NPM workspaces

Механизм NPM workspaces позволяет централизованно управлять несколькими пакетами.

В package.json в секции workspaces может быть указана следующая запись:

"workspaces": [ "packages/a", "packages/b" ]

В таком случае агент Johnny будет обрабатывать корневой package.json и все package.json всех пакетов из workspaces как единое целое.

PNPM

Создание файла pnpm-lock.yaml

  1. Инициализируйте проект:
    pnpm init -y
    
  2. Установите зависимости:
    pnpm install
    

Поддержка механизма PNPM package alias

Механизм PNPM package alias позволяет устанавливать пакеты под разными именами, что удобно для одновременного использования нескольких версий библиотеки, замены зависимости без изменения её имени в коде и работы с форками.

Вместо стандартного указания версии используется синтаксис, явно задающий, какой пакет и его версию установить под нужным именем. Это упрощает тестирование, обновления и совместимость зависимостей.

В package.json в секции dependencies может быть указана следующая запись:

"dependencies": {
  "lodash-old": "npm:lodash@3.10.1"
}

Консольный агент Johnny корректно обрабатывает эту запись, распознавая, что lodash-old – это alias для lodash версии 3.10.1. В ходе анализа зависимостей учитывается оригинальный пакет, предотвращая ошибки, связанные с несуществующими именами.

Поддержка механизма PNPM overrides

Механизм PNPM overrides позволяет изменить версии транзитивных зависимостей. Это полезно в случаях необходимости замены зависимости с известной уязвимостью, либо замены зависимости на форк.

В в секции pnpm/overrides файла package.json может быть указана следующая запись:

"pnpm": {
  "overrides": {
    "example-package": "^1.3.0"
  }
}

Поддержка механизма PNPM workspaces

Механизм PNPM workspaces позволяет централизованно управлять несколькими пакетами.

В pnpm-workspace.yaml расположенном рядом с корневым package.json быть указана следующая запись:

packages:
- 'packages/*'

В таком случае агент Johnny будет обрабатывать корневой package.json и все package.json всех пакетов из workspaces как единое целое.

Yarn

Создание файла yarn.lock

  1. Инициализируйте проект:
    yarn init -y
    
  2. Установите зависимости:
    yarn install
    

Поддержка механизма Yarn package alias

Механизм Yarn package alias позволяет устанавливать пакеты под разными именами, что удобно для одновременного использования нескольких версий библиотеки, замены зависимости без изменения её имени в коде и работы с форками.

Вместо стандартного указания версии используется синтаксис, явно задающий, какой пакет и его версию установить под нужным именем. Это упрощает тестирование, обновления и совместимость зависимостей.

В package.json в секции dependencies может быть указана следующая запись:

"dependencies": {
  "lodash-old": "npm:lodash@3.10.1"
}

В yarn.lock формируется запись:

"lodash-old@npm:lodash@3.10.1":

Консольный агент Johnny корректно обрабатывает эту запись, распознавая, что lodash-old – это alias для lodash версии 3.10.1. В ходе анализа зависимостей учитывается оригинальный пакет, предотвращая ошибки, связанные с несуществующими именами.

Поддержка механизма Yarn selective dependency resolution

Yarn поддерживает избирательное разрешение версий через поле resolutions в package.json, что позволяет задавать конкретные версии зависимостей без редактирования yarn.lock.

Этот механизм полезен, если вам нужно обновить подзависимость, которая не обновляется часто, исправить уязвимость в транзитивной зависимости или зафиксировать версию из-за проблемного обновления.

CodeScoring поддерживает обработку данного механизма в консольном агенте Johnny. Вот несколько сценариев его работы:

Замена пакета

Для замены пакета через механизм resolutions, в package.json добавляется следующая запись. В данном примере пакет parcel/watcher заменяется на пакет favware/skip-dependency.

"resolutions": {
  "@parcel/watcher": "npm:@favware/skip-dependency@latest"
}

Соответствующая данному пакету запись в файле yarn.lockбудет следующей:

dependencies:
  "@parcel/watcher": "npm:2.1.0"

При установке в сборке используется пакет favware/skip-dependency версии 1.2.2. Консольный агент корректно идентифицирует данный механизм и анализирует именно финальный пакет.

"@parcel/watcher@npm:@favware/skip-dependency@latest":
  version: 1.2.2
  resolution: "@favware/skip-dependency@npm:1.2.2"

Фиксация версии транзитивной зависимости

Для фиксации версии через механизм resolutions в package.json добавляется следующая запись. В данном примере версия пакета http-signature фиксируется на 1.3.4.

"resolutions": {
  "http-signature": "1.3.4"
}

Соответствующие данному пакету записи в файле yarn.lock будут следующими:

dependencies:
  http-signature "~1.2.0"

При установке в сборке будет использована версия http-signature 1.3.4. Консольный агент анализирует финальную версию пакета.

http-signature@1.3.4, http-signature@~1.2.0:
  version "1.3.4"
  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.4.tgz#a65b41193110b222364e776fd1ac848655a0e2f0"

Фиксация версии при множественных зависимостях

Для фиксации версии при наличии нескольких зависимостей через механизм resolutions в package.json добавляется следующая запись. В данном примере версия пакета yaml фиксируется на 2.2.2.

"resolutions": {
  "yaml": "2.2.2"
}

Соответствующие данному пакету записи в файле yarn.lock будут следующими:

dependencies:
  yaml: ^1.10.0
  yaml: ^2.2.1
  yaml: ^1.7.2
  yaml: ^1.10.2
  yaml: ^2.3.4
  yaml: 2.3.1
  yaml: ^2.1.1

При установке в сборке будет использована версия 2.2.2. Консольный агент анализирует только зафиксированную в resolutions версию пакета.

"yaml@npm:2.2.2":
  version: 2.2.2
  resolution: "yaml@npm:2.2.2"