npm встановити з Git у певній версії


181

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

"private": "true"

до package.jsonфайлу, і я також знаю, що я можу npm installцей модуль використовувати шлях до файлової системи або посилання на сховище git, включаючи GitHub.

Я також знаю, що я можу поставити такий шлях до файлової системи або посилання на git repo package.json, щоб dependenciesчастина могла виглядати приблизно так:

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

Мені зараз хочеться не посилання на останню версію, а на конкретну. Єдина мені відома можливість - прив’язати до певного комітету за допомогою його ідентифікатора. Але це спосіб менш читабельний і гірше ремонтується, ніж використання номера версії типу 0.3.1.

Отже, моє запитання: чи можна в будь-якому випадку вказати такий номер версії та змусити npm шукати сховище git за останньою версією, яка включає цю версію?

Якщо ні, як ви вирішите це питання у своїх проектах? Ви живете з посвідченнями комісій або є кращі рішення для цього?

Відповіді:


193

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

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

Але, якщо його немає в реєстрі, на нього доведеться посилатись URL-адресою або Git URL-адресою . Щоб вказати версію з URL-адресою Git <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ні в чому не буває.
loretoparisi

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

З липня 2016 року розміщення власного реєстру стало складнішим, оскільки вони переходять від couchdb до мікросервісів
Yan Foto

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

237

Прийнята відповідь не спрацювала для мене. Ось що я роблю, щоб витягнути пакет з 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", але коли я спробував запустити свою програму, вимога ("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:оскільки це за замовчуванням.


Режим архіву також працює для комітетів; наприклад, `пряжа додати github.com/github/fetch/archive/… `
bvj

Найчистіший розчин.
Чарлі Бодкін

8

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

Метод @surjikal, описаний вище, працює для філійних комірок , але він не працює для дерева, який я намагався включити.


Режим архіву також працює для комітетів. Наприклад, отримання @ a2fbf83

npm :

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вимога не часто згадується в мережі .. (не те, що я міг би понести в цьому, принаймні).
Камафезер

"Додайте свої пакунки до свого пакету.json із зазначенням повної назви пакету." - Не дуже підкреслюючи це: help.github.com/en/articles/…
Kamafeather

Я з'ясував, що npm install --save git+https://<remote-github-repo-url>це досить безпечний спосіб не вдаватися до цієї проблеми знову в майбутньому.
Камафезер

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#dependitions


Усі посилання 404
Cyrille Pontvieux
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.