Как переопределить вложенные версии зависимостей NPM?

Я хотел бы использовать пакет grunt-contrib-jasmine NPM. Он имеет различные зависимости. Часть графика зависимостей выглядит так:

─┬ [email protected]
 │ ├─┬ [email protected]
 │ │ ├─┬ [email protected]

К сожалению, есть ошибка в этой версии phantomjs, которая предотвращает ее правильную установку в Mac OS X. Это исправлено в последней версии.

Как я могу получить grunt-lib-phantomjs для использования более новой версии phantomjs?

Некоторый дополнительный контекст:

Ответ 1

Вы можете использовать функциональность npm shrinkwrap, чтобы переопределить любую зависимость или суб-зависимость.

Я только что сделал это в нашем грандиозном проекте. Нам нужна была более новая версия connect, начиная с 2.7.3. доставляла нам неприятности. Поэтому я создал файл с именем npm-shrinkwrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "[email protected]~2.7.3"
        }
      }
    }
  }
}

npm должен автоматически поднять его во время установки для проекта.

(См.: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/)

Ответ 2

Для пользователей с 2018 года и более поздних версий, используя npm версии 5 или новее: отредактируйте свой package-lock.json: удалите библиотеку из раздела "requires" package-lock.json "requires" и добавьте ее в разделе "dependencies".

Например, вы хотите, deglob пакет deglob использовал версию пакета glob 3.2.11 вместо текущей. Вы открываете package-lock.json и видите:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

Удалите "glob": "7.1.2", из "requires", добавьте "dependencies" с правильной версией:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

Теперь удалите папку node_modules, запустите npm install и она добавит недостающие части в раздел "dependencies".

Ответ 4

NPM термоусадочная пленка предлагает хорошее решение этой проблемы. Это позволяет нам переопределить эту версию конкретной зависимости конкретного субмодуля.

По сути, когда вы запускаете npm install, npm сначала просматривает ваш корневой каталог, чтобы узнать, существует ли файл npm-shrinkwrap.json. Если это произойдет, он будет использовать это сначала для определения зависимостей пакетов, а затем перейдет к обычному процессу работы с файлами package.json.

Чтобы создать npm-shrinkwrap.json, все, что вам нужно сделать, это

 npm shrinkwrap --dev

код:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "[email protected]~2.7.3"
        }
      }
    }
  }
}

Ответ 5

Вы также можете рассмотреть следующий подход.

Предположим, у вашего проекта есть зависимость от пакета A, которая, в свою очередь, зависит от пакета B. Создание этой цепочки зависимостей: your_project → Package A → Package B В версии пакета B существует ошибка, от которой зависит пакет A, и вы хотите обновить версию сейчас, а не через месяц.

Примените эти шаги

Для начала начните с шага 1. Для работы в вашем собственном проекте начните с шага 3.

  1. Создайте новый временный проект с помощью npm init
  2. Установить пакет A npm я [email protected] --save
  3. Установите пакет B npm я [email protected]_version --save
  4. Откройте файл package-lock.json и скопируйте всю корневую зависимость пакета B.
  5. Удалить пакет B npm un B --save
  6. Удалите папку node_modules и package-lock.json
  7. Установите все остальные зависимости npm i
  8. Откройте файл package-lock.json и вставьте зависимость корневого уровня, которую вы скопировали ранее.
  9. Настройте версию пакета B в зависимостях пакета A на фиксированную версию.
  10. Удалите папку node_modules.
  11. Установить без побочных эффектов npm я --no-save

Теперь вы должны увидеть зависимость корневого уровня в папке вашего проекта node_modules с фиксированной версией.

Примечание. Я не проверял это в ситуациях, когда существует несколько зависимостей корневого уровня, которые зависят от пакета B. Итак, your_project → Package A → Package B и your_project → Package C → Package B Я подозреваю, что это все еще будет работать, и Package C будет поддерживать свою собственную версию, но я не уверен.

Почему это так?

Используя эти шаги, вы позволяете npm выполнять большую часть работы за вас. Например, он также генерирует хэш целостности для пакета B.

Почему шаг X?

Шаг 3: Это добавляет фиксированную версию пакета B в качестве зависимости первой степени и корректирует текущий package-lock.json. Тем не менее, пакет A по-прежнему зависит от сломанной версии пакета B. Он хранится в собственной папке node_modules.

Шаг 5: То же, что и шаг 3, за исключением полного удаления пакета B.

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

Шаг 7: При этом устанавливаются все зависимости, возвращается к "сломанной" ситуации и создается файл package-lock.json со сломанной версией пакета B на корневом уровне.

Шаг 10 + 11: Это гарантирует, что мы имитируем новую установку. NPM всегда ищет файл package-lock.json если нет папки 'node_modules'. Использование --no-save гарантирует отсутствие побочных эффектов, таких как изменения в файле package-lock.json.

Ответ 6

Простейшим минимумом является добавление только начальной сжатой зависимости json в package.json. Необходимы "от" и "до"

"grunt-contrib-connect": {
  "version": "0.3.0",
  "from": "[email protected]",
  "dependencies": {
    "connect": {
      "version": "2.8.1",
      "from": "[email protected]~2.7.3"
    }
  }
}