Npm установить из Git в определенной версии

Предположим, что я написал модуль для Node.js, который я хотел бы сохранить приватным. Я знаю, что я могу (должен) добавить строку:

"private": "true"

в файл package.json, и я также знаю, что могу npm install этот модуль использовать путь к файловой системе или ссылку на репозиторий git, включая GitHub.

Я также знаю, что я могу поместить такой путь файловой системы или ссылку на репозиторий git в package.json, так что часть dependencies может выглядеть примерно так:

"dependencies": {
  "myprivatemodule": "[email protected]:..."
}

Теперь я хочу не связываться с последней версией, а с конкретным. Единственная возможность, о которой я знаю, - это связать конкретную фиксацию с использованием ее идентификатора. Но это менее читаемо и хуже обслуживается, чем использование номера версии, например 0.3.1.

Итак, мой вопрос: можно ли в любом случае указать такой номер версии и заставить npm искать репозиторий git для последней фиксации, которая включает эту версию?

Если нет, как вы решаете эту проблему в своих проектах? Вы живете с идентификаторами фиксации или есть лучшее решение для этого?

Ответ 1

A зависимость должна быть доступна из registry для установки только с указанием дескриптора version.

Вы можете создать и использовать свой собственный реестр вместо registry.npmjs.org, если ваши проекты должны " публично публиковать.

Но если это не в реестре, на него нужно будет ссылаться URL или Git URL. Чтобы указать версию с URL-адресом Git, включите соответствующий <commit-ish>, например тег, в конце как Фрагмент URL.

Пример, для тега с именем 0.3.1:

"dependencies": {
  "myprivatemodule": "[email protected]:...#0.3.1"
}

Примечание. В приведенном выше фрагменте показан базовый URL-адрес, аналогичный тому, который был опубликован в вопросе.

Отрезанная часть (...) должна быть заполнена:

"myprivatemodule": "[email protected]:{owner}/{project}.git#0.3.1"

И другой формат адреса будет необходим, если доступ к SSH недоступен:

"myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1"

В зависимости от вашей ОС вы также можете link в зависимости от другой папки, в которой вы клонировали ее из Github.

Ответ 2

Принятый ответ не работал для меня. Вот что я делаю, чтобы вытащить пакет из github:

npm install --save "git://github.com/username/package.git#commit"

Или добавив его вручную в package.json:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}

Ответ 3

Если по версии вы имеете в виду тег или выпуск, тогда github предоставляет ссылки для загрузки. Например, если я хочу установить fetch версию 0.3.2 (она недоступна в npm), то я добавляю к своему package.json под dependencies:

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",

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

Update:

В наши дни подход, который я использую, представляет собой компактную нотацию для обслуживаемой службой GitHub:

"dependencies": {
  "package": "github:username/package#commit"
}

Если фиксация может быть чем-то обязательным, например тегом. В случае GitHub вы даже можете удалить начальный github:, поскольку он по умолчанию.

Ответ 4

Мой пример комментария к @qubyte выше был прерван, так что здесь что-то, что легче читать...

Описанный выше метод @surjikal работает для коммитов веток, но он не работал для коммитов дерева, которые я пытался включить.


Режим архива также работает для коммитов. Например, fetch @a2fbf83

нпм:

npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

пряжа:

yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

формат:

 https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz


Вот коммит дерева, который требует /archive/ mode:
yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

для соответствующего коммита vuex

Ответ 5

Эта команда устанавливает username/package пакета npm из определенного git commit:

npm install https://github.com/username/package#3d0a21cc

Здесь 3d0a21cc - это первые 8 символов хеша коммита.

Ответ 6

Если вы делаете это с несколькими модулями и хотите иметь больше контроля над версиями, вы должны изучить свой собственный частный реестр npm.

Таким образом, вы можете публиковать свои модули в частном реестре npm и использовать записи package.json так же, как и для общедоступных модулей.

https://docs.npmjs.com/files/package.json#dependencies

Ответ 7

Я опишу здесь проблему, с которой я столкнулся при запуске npm install - пакет не отображается в node_modules.

Проблема заключалась в том, что значение name в package.json установленного пакета отличалось от имени импортируемого пакета (ключ в package.json моего проекта).

Поэтому, если имя вашего установленного проекта - some-package (значение name в его package.json), то в package.json вашего проекта напишите: "some-package": "owner/some-repo#tag".