Как установить частный модуль NPM без моего собственного реестра?


329

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

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

Могу ли я просто установить модуль NPM, который находится в локальной файловой системе, или, возможно, даже из git?

npm install --from-git git@server:project

Ответы:


263
cd somedir
npm install .

или

npm install path/to/somedir

somedirдолжен содержать package.jsonвнутри него.

Он знает и о git:

npm install git://github.com/visionmedia/express.git

4
Путь / к / somedir решение вроде работает, но потом это ужасно, потому что все операторы require должны включать этот относительный или абсолютный путь. Пожалуйста, поправьте меня, если я делаю что-то не так ...
Люк Байес

3
@ Лука, да, ты не прав. После того, как npm installвсе файлы скопированы в каталог вашего проекта. Таким образом, пути в requireвыражениях будут относительными только к вашему каталогу проекта.
Михай

4
Меня смущает верхняя часть, и единственная причина, по которой я сам не проверял это, заключается в том, что я все еще учусь и у меня нет личного модуля для работы. В любом случае, изменив каталог на тот, где находится модуль, а затем вызвав его, installразве это не установится там, а не для проекта, для которого вы хотите его использовать?
Адам Бек

11
Примечание: (a) при использовании git-репозиториев вы можете указать ветку / commit / tag, добавив #<ref>в конец URL-адреса git, например git://github.com/visionmedia/express.git#v0.0.1; (b) На всякий случай добавьте "private": trueв package.json ваши личные репозитории. Это гарантирует, что npm никогда не позволит вам случайно опубликовать свой секретный соус в официальном реестре npm. (согласно debuggable.com/posts/… )
Рафаэль Ксавье

9
К вашему сведению, если вы отправляете свой GIT через http, вам нужно, npm i git+http://all/the/things.gitхотя он git clone http://all/the/things.gitработает просто отлично
slf

527

В ваши частные модули npm добавьте

"private": true 

в ваш package.json

Затем для ссылки на приватный модуль в другом модуле используйте это в вашем package.json

{
    "name": "myapp",
    "dependencies": {
        "private-repo": "git+ssh://git@github.com:myaccount/myprivate.git#v1.0.0",
    }
}

59
Это действительно правильный ответ, если вы хотите, чтобы ваш package.json поддерживал список зависимостей частного репозитория, что является хорошей вещью (tm), которую вы должны делать.

6
В примере он ссылается на определенный тег, но если у вас его нет, по умолчанию он будет мастером. (см. git-scm.com/book/en/Git-Basics-Tagging )
250R

4
Я не понимаю, как эта командная строка может загружать код из частного репозитория github, если я не предоставляю свои учетные данные! Так как я могу передать свои учетные данные на github?
Ренато Гама

28
Обратите внимание, что эта "private": trueчасть не обязательна, но она поможет предотвратить случайную публикацию вашего частного репо в публичный реестр npm.
evanrmurphy

2
npm также ищет несколько переменных окружения. Из руководства в npm install <git remote url>разделе есть варианты, такие как GIT_ASKPASSи. GIT_SSHПример использования для выбора ключа, отличного от id_rsa по умолчанию:GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github.com:npm/npm.git
Jasmine Hegman

62

Могу ли я просто установить пакет NPM, который находится в локальной файловой системе, или, возможно, даже из git?

Да, ты можешь! Из документов https://docs.npmjs.com/cli/install

Пакет это:

  • а) папка, содержащая программу, описанную файлом package.json
  • б) сжатый архив, содержащий (а)
  • в) URL-адрес, который разрешает (б)
  • г) а <name>@<version> который опубликован в реестре с (с)
  • е) <name>@<tag> указывает на (г)
  • е) <name> который имеет «последний» тег, удовлетворяющий (e)
  • г) а, <git remote url>который разрешает (б)

Разве npm не блестящий?


2
Обратите внимание, что если вы выберете вариант b), то это на самом деле должен быть сжатый архив , zip-архив этого не сделает. Т.е. если вы создаете свой пакет с tar -czf my-package.tar.gz dist(при условии, что в вашей distпапке также есть нужный package.jsonфайл), то вы можете сделать это npm install ../my-lib/my-package.tar.gzиз другого вашего проекта.
Даниэль Кис-Надь

48

Обновление январь 2016

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

И Github, и Bitbucket поддерживают концепцию генерации ключа API команды . Этот ключ API можно использовать в качестве пароля для выполнения запросов API этой команды.

В ваши частные модули npm добавьте

"private": true 

на ваш package.json

Затем для ссылки на приватный модуль в другом модуле используйте это в вашем package.json

    {
        "name": "myapp",
        "dependencies": {
            "private-repo":
"git+https://myteamname:aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4@bitbucket.org/myprivate.git",
        }
    }

где название команды = myteamname , и ключ API = aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4

Здесь я ссылаюсь на репозиторий bitbucket, но он также почти идентичен при использовании github.

Наконец, в качестве альтернативы, если вы действительно не возражаете платить по 7 долларов в месяц (на момент написания), то теперь вы можете иметь частные модули NPM из коробки.


Можете ли вы использовать это, если вы хотите иметь глобальный модуль?
пи.

Боюсь, это не работает для меня. И удаленный, и хранилище не найдены. Любые идеи?
Томас Борманс

@ThomasBormans - все еще есть проблемы? Пожалуйста, вставьте (зашифруйте свою команду / ключ API) то, что у вас есть в качестве строки в разделе зависимостей вашего package.json - согласно приведенным выше инструкциям. Я обнаружил, что это хорошо работает как для частных репозиториев github, так и для bitbucket. Что вы используете?
arcseldon

@arcseldon "name": "git + key: x-oauth-basic@bitbucket.org/user/repo.git " возвращает EISDIR: недопустимая операция с каталогом, прочитайте . И "name": "git + user: key@bitbucket.org/repo.git " возвращает несколько ошибок, в том числе следующие слова remote: Not Found, fatal: repository, Команда завершилась неудачно: git clone . Любые идеи?
Томас Борманс

Попробуйте придерживаться «точного» формата, который я дал в ответе: «git + https: // <myteamname>: <my_key> @ bitbucket.org / <my_repo_name> .git Как вы сгенерировали ключ API? Проверяли ли вы дважды? это правильно в ваших настройках bitbucket ... извините, чтобы спросить очевидное, но я почти на 100% уверен, что это должно сработать
arcseldon

30

FWIW: У меня были проблемы со всеми этими ответами при работе с хранилищем частной организации.

У меня сработало следующее:

npm install -S "git+https://username@github.com/orgname/repositoryname.git"

Например:

npm install -S "git+https://blesh@github.com/netflix/private-repository.git"

Я не совсем уверен, почему другие ответы не сработали для меня в этом одном случае, потому что это то, что я пытался сначала, прежде чем я попал в Google и нашел этот ответ. И другие ответы - то, что я сделал в прошлом.

Надеюсь, это поможет кому-то еще.


2
Можете ли вы использовать подпапку git-репо?
Крис

Работал на меня в 2019 году! Но я должен был убедиться, что у git есть учетные данные для доступа к этой учетной записи. (Например, дважды проверьте git clone https://и убедитесь, что пароль не нужен при втором запуске. Тогда все
готово

9

У меня была такая же проблема, и после некоторого поиска я нашел Реджи ( https://github.com/mbrevoort/node-reggie ). Это выглядит довольно солидно. Это позволяет облегчить публикацию модулей NPM на частных серверах. Не идеально (без аутентификации при установке), и он все еще очень молодой, но я проверил его локально, и, похоже, он делает то, что говорит.

То есть ... (и это только из их документов)

npm install -g reggie
reggie-server -d ~/.reggie

затем перейдите в каталог вашего модуля и ...

reggie -u http://<host:port> publish 
reggie -u http://127.0.0.1:8080 publish 

наконец, вы можете установить пакеты из reggie, просто используя этот URL либо в прямой команде npm install, либо из пакета package.json ... вот так

npm install http://<host:port>/package/<name>/<version>
npm install http://<host:port>/package/foo/1.0.0

или..

dependencies: {
    "foo": "http://<host:port>/package/foo/1.0.0"
}

7

Структурируйте свой код доступным способом как ниже. Если это возможно для вас.

  • NodeProjs \ Apps \ MainApp \ package.json

  • NodeProjs \ Modules \ DataModule \ package.json

В пределах MainApp @ NodProjs \ Apps \ MainApp \

npm install --S ../../Modules/DataModule

Вам может потребоваться обновить package.json как:

 "dependencies": {
       "datamodule": "../../Modules/DataModule"
}

Это сработало для моей ситуации.


5

Npm теперь предоставляет неограниченные частные размещенные модули за $ 7 / пользователь / месяц, используемые так

cd private-project
npm login

в вашем комплекте JSON "name": " @username/private-project"

npm publish

тогда потребовать ваш проект:

cd ../new-project
npm install --save @username/private-project

1
Требуется ли для этого этап входа в систему на стороне клиента?
Эйдан Хулачан

Какая альтернатива этому? Например, если вы хотите разместить свой «пакет» на S3 и вытащить оттуда.
Кон Антонакос

4

Начиная с ответа arcseldon , я обнаружил, что название команды было необходимо в URL:

npm install --save "git+https://myteamname@aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4@bitbucket.org/myteamname/myprivate.git"

И обратите внимание, что ключ API доступен только для команды, а не для отдельных пользователей.


2

Настройка для установки из общедоступного репозитория Github, даже если машина находится под брандмауэром:

dependencies: {
   "foo": "https://github.com/package/foo/tarball/master"
}

2

Я использую следующее с частным репозиторием GitHub:

npm install github:mygithubuser/myproject

2

Это было то, что я искал :

# Get the latest from GitHub, public repo:
$ npm install username/my-new-project --save-dev
# Bitbucket, private repo:
$ npm install git+https://token:x-oauth-basic@github.com/username/my-new-project.git#master
$ npm install git+ssh://git@github.com/username/my-new-project.git#master

#  or from Bitbucket, public repo:
$ npm install git+ssh://git@bitbucket.org/username/my-new-project.git#master --save-dev
# Bitbucket, private repo:
$ npm install git+https://username:password@bitbucket.org/username/my-new-project.git#master
$ npm install git+ssh://git@bitbucket.org/username/my-new-project.git#master
# Or, if you published as npm package:
$ npm install my-new-project --save-dev

2

Вы можете использовать ВердаччоДля этой цели который представляет собой легкий частный реестр прокси-серверов npm, встроенный в Node.js. Также это бесплатно и с открытым исходным кодом. Использование Verdaccio не требует столько хлопот, как простой частный реестр npm.

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

Это требует node >=8.x.

    // Install it from npm globally
    npm install -g verdaccio

    // Simply run with the default configuration that will host the registry which you can reach at http://localhost:4873/
    verdaccio

    // Set the registry for your project and every package will be downloaded from your private registry
    npm set registry http://localhost:4873/

    // OR use the registry upon individual package install
    npm install --registry http://localhost:4873

Он также имеет докер, так что вы можете легко опубликовать его в общедоступном докере, и, вуаля, у вас есть частный репозиторий npm, который можно распространять другим способом, как вы его настраиваете!


0

Очень просто -

npm config set registry https://path-to-your-registry/

Это на самом деле устанавливает registry = "https://path-to-your-registry"эту строку/Users/<ur-machine-user-name>/.npmrc

Все значения, которые вы установили явно или были установлены по умолчанию, могут быть просмотрены с помощью - npm config list

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