Установка npm из Git в определенной версии


181

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

"private": "true"

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

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

"dependencies": {
  "myprivatemodule": "git@github.com:..."
}

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

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

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

Ответы:


193

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

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

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

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

"dependencies": {
  "myprivatemodule": "git@github.com:...#0.3.1"
}

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

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

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

Кроме того, когда SSH-доступ недоступен, потребуется другой формат адреса:

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

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


1
Кажется, что некоторые ссылки в этом посте устарели, поскольку вместо них они ведут на 404 страницы. Что очень жаль, поскольку кое-что из этой информации я искал довольно давно.
MvG

5
Я пометил конкретную версию git tag -a "1.0.0"и нажал git push --tags, а затем добавил #v1.0.0в конце git+sshзависимости. Но npm updateничего не происходит.
Лоретопариси

3
@loretoparisi Извините. Я не хотел предполагать, что добавление vбыло необходимо. После того , как #, то фрагмент должен соответствовать полному имени тега (или другому commitsh ) - в вашем случае #1.0.0.
Джонатан Лоновски

По состоянию на июль 2016 года, хостинг собственного реестра стал более сложным, поскольку они переходят с couchdb на микросервисы
Ян Фото

3
Теперь вы можете делать npm i {owner}/{project}#{tag}или добавлять "{library}": "github:{owner}/{project}#{tag}"в package.json вместо использования git@github.comилиgit://github.com
Mike W

238

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

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

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

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

41
Если вы используете http / https, убедитесь, что вы включили префикс "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
Это работало до «npm install», но когда я попытался запустить свое приложение, require ('mymodule') не смог найти его пакет. Даже если пакет находится в каталоге node_modules с тем же именем.
Деррик

О, данный модуль не включает сборку с конкретным коммитом, который я хотел, поэтому, если у вас возникла та же проблема, вам, возможно, придется собрать его вручную.
Деррик

1
Вы также можете использовать, #tagкоторый обычно указывает на номер версии
deltree

1
@surjikal вам нужно пометить релиз, прежде чем вы сможете использовать номера версий с git. например, git tag -a v1.0.1 && git push --tag && git pushкак @Jonathan Lonowski также сказал в комментарии.
dotnetCarpenter

80

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

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

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

Обновить:

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

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

Где коммит может быть чем угодно, например, тегом. В случае с GitHub вы можете даже сбросить исходное, github:так как это по умолчанию.


Режим архива также работает для коммитов; например, `
yarn

Самое чистое решение.
Чарли Бодкин

8

Мой пример комментария к @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/режима:

yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

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


8

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

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

Вот 3d0a21ccпервые 8 символов хеша коммита.


3

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

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

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


Хотелось бы, чтобы я нашел ваш ответ раньше 😓 - я только что решил, с той же проблемой, заставляющей меня некоторое время бороться; и это nameтребование не упоминается часто в сети .. (не то, чтобы я мог понести это, по крайней мере).
Kamafeather

Msgstr "Добавьте зависимости вашего пакета в ваш package.json, указав полное имя пакета." - Не особо подчеркивая это: help.github.com/en/articles/…
Kamafeather

Я обнаружил, что npm install --save git+https://<remote-github-repo-url>это довольно безопасный способ избежать повторения этой проблемы в будущем.
Kamafeather

2

Мне нужно было запустить две версии tfjs-core и обнаружил, что обе должны быть собраны после установки.

package.json:

"dependencies": {
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
}

Затем:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

И, наконец, использовать библиотеки:

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';

Это работало отлично, но, безусловно, #hoodrat


1
Спасибо, я пытался импортировать это всеми возможными способами. Мне нужно было увидеть ваш фрагмент, чтобы понять, что мне нужно импортировать файл прямо из файла.
Виктор Ивенс

1

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

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

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


Все ссылки 404
Cyrille Pontvieux
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.