Link npm: Page not found · GitHub Pages
Содержание
npm link на стероидах / Хабр
Думаю многие из вас уже сталкивались с локальной разработкой npm-пакетов. Обычно никаких трудностей это не вызывает: создаём папку, запускаем npm init
, пишем тесты, дальше используем npm link (либо просто симлинк) и «шлифуем» api до полной готовности.
Звучит просто… только если вы не используете Babel, Rollup, Webpack и т.п. Иными словами, всё хорошо, пока проект не нужно собрать перед публикацией, да ещё с модификацией исходного кода. Кроме того, одновременно разрабатываемых пакетов может быть больше чем один, что в разы усложняет «жизнь». Чтобы исправить эту ситуацию, пришлось сделать маленькую утилиту npmy, под катом небольшая статья с описанием тех. процесса работы и пример использования.
Итак, как я уже говорил, основная проблема локальной разработки — это использование scripts/хуков (prepublish, prepublishOnly и т.д.), именно по этой причине npm link
не подходит, ведь по сути — это банальный симлинк, да ещё по завершению разработки нужно не забывать про npm unlink
.
Поэтому я принялся за свое решение, которое:
- Имеет простую настройку.
- Эмулирует полный цикл публикации.
- Создает симлинк на псевдо-опубликованную версию (далее ПОВ).
- Следит за изменениями и обновляет ПОВ.
Настройка проекта
Первой мыслью было добавить правила прямо в package.json, но это неправильно, ведь это именно локальная разработка, поэтому правила было решено размещать в .npmyrc
, который без труда можно добавить в .gitignore
.
Сам файл — ни что иное, как простой JSON-объект, у которого:
key
— название зависимости изpackage.json
;value
— локальный путь до разрабатываемого пакета (относительный или абсолютный).
Всё, на этом конфигурация закончена.
Запуск
Заходим в папку с .npmyrc
и запускаем npmy
, который:
- Читает
.npmyrc
. - Фильтруем список зависимостей на два списка для:
- установки из NPM;
- локальной установки.
- Установка зависимостей из NPM.
- Псевдо-публикация пакетов из
.npmyrc
. - Создание симлинка на ПОВ.
- Запуск отслеживания изменений (watch).
Процесс псевдо-публикации
Это самое интересное, ради чего всё и затевалось. Для начала вспомним, как это работает в оригинальном npm.
Как видите, тут нас ждет сюрприз, prepublish
и prepare
выполняются как на npm publish
, так и на npm install
(без аргументов). Поэтому если вам нужна сборка проекта перед публикацией, используйте prepublishOnly
, но только начиная с 5 версии. Хоть этот хук и добавили в 4, работает он неправильно, и вместо собранного пакета уедет не пойми что, увы.
В моём процессе перед запуском всех хуков есть ещё одно звено, а именно создание копии проекта (вместе с node_modules):
- Копия создается через
rsync
в темповую папку. - Модифицируется
package.json
, из которого убираетсяnpm test
, чтобы не тормозить процесс псевдо-публикации. - Затем для копии запускаются все хуки соответствующие процессу публикации.
- И в финальный штрих: удаление всего, что не соответствует секции
files
. - Profit.
Вуаля, теперь мы имеем версию пакета, которую бы вы получили при установки из npm
. Также при каждом изменении исходников, ПОВ будет обновлена автоматом.
Кроме этого, npmy
не забывает про секцию bin в package.json
и корректно создаёт симлинки на объявленные там скрипты.
Итого
npm install -g npmy
- Создаем
.npmyrc
в проекте - Запускаем
npmy
Спасибо за внимание, надеюсь утилита будет полезна не только мне. :]
P.S.1.0.0″
}
}
При выполнении npm install
будут установлены все зависимости, а также будет создана конфигурация bin
node-red
.
Но мой собственный bin
будет полностью проигнорирован. Это не возможно, чтобы использовать cli-name
в cmd
. Необходимо также выполнить npm link
, на втором шаге. Тогда cli-name
будет доступен как команда в консоли. Я даже пытался использовать сценарий postinstall
из npm
с npm link
в нем, но потом у меня получился цикл …
Есть ли способ сделать это за один шаг на npm install
?
node.js
npm
npm-install
package.json
npm-link
Поделиться
Источник
eisbehr
21 февраля 2017 в 13:39
6 ответов
1
Вы можете попробовать изменить свой package.1.0.0"
}
}
И просто беги:
npm install
Поделиться
jccguimaraes
21 февраля 2017 в 13:46
1
Чтобы запустить двоичный модуль global
( bin
), вам необходимо установить его глобально.
npm -g install
Другой вариант (если вы используете linux) — использовать $(npm bin)/<module>
, если он не установлен глобально.
Поделиться
Jake Holzinger
14 марта 2017 в 02:10
1
Похоже, на самом деле нет встроенного способа автоматического выполнения этих задач. Поэтому я создал запрос на эту функцию непосредственно на npm
. Похоже, что новая команда, такая как npm il
, может быть реализована.
Я буду обновлять это здесь, когда будет доступен тот или иной способ.
https://github.com/npm/npm/issues/15999
Поделиться
eisbehr
14 марта 2017 в 14:26
0
npm-ссылка действительно предназначена для другой цели. В тот момент, когда вы установите npm, вы уже сможете использовать его в командной строке.
npm ссылка предназначена для привязки текущей папки разработки к установленному каталогу вашего пакета. Это делается для того, чтобы при внесении изменений в папку разработки она автоматически становилась доступной в cli, и вам не нужно было переустанавливать ее.
После установки попробуйте перейти к usr/local/bin <-, где это должно быть. если вы не можете найти мой-executable.js здесь. Тогда что — то не так в процессе установки.
Поделиться
Subomi
13 марта 2017 в 11:05
0
Вы можете создать сценарий в своем package.1.0.0"
}
}
Затем просто запустите npm run install-link
, и он выполнит обе команды.
Поделиться
grizzthedj
07 марта 2017 в 20:38
Поделиться
אלחנן בעל-שם
27 мая 2020 в 06:52
Похожие вопросы:
Как сказать npm построить модуль при установке с зависимостями родительского проекта?
Я хотел бы получить объяснение о том, как npm модули получают сборку при установке, я приведу пример: Когда я смотрю на исходники модуля material-ui npm на GitHub , там есть исходники, но нет…
npm пакеты недоступны при локальной установке
Я работаю с npm в веб-приложении и обнаружил проблему при использовании некоторых пакетов, которые требуют выполнения команд terminal, таких как nodemon и concurrently Я установил его через sudo npm…
хотите выполнить пользовательское действие при установке APK?
Я хочу выполнить некоторую пользовательскую операцию при установке APK. Эти операции включают копирование общего объекта (. so) в /system/lib ,создание некоторых общих настроек, чтобы мое приложение…
Как удалить пакет, установленный с помощью ссылки npm?
При установке пакета узла с использованием sudo npm link в каталоге пакета, как я могу удалить пакет после завершения разработки? npm link устанавливает пакет как символическую ссылку в глобальном…
при установке npm я получаю следующую ошибку
При установке npm я получаю ошибку, как показано ниже. Пожалуйста, помогите мне. заранее спасибо.
npm установке кидает ошибку в Node-sass установки
Я пытаюсь выполнить команду установки npm, но получаю ниже ошибку при установке node-sass . package.json : { name: XXXXX, version: 1.0.0, description: , main: index.js, dependencies: { angular:…
Npm не может быть успешно установлен при установке nodejs
Я новичок в использовании nodejs. Я установил Node.js с помощью этой команды sudo apt-get install -y nodejs Обычно, при установке это Node.js, npm будут установлены автоматически. Но при проверке…
Как и что делает npm link в этом примере?
Я устанавливаю react-native-elements , и в руководстве по установке есть эта команда: npm i react-native-vector-icons —save && react-native link react-native-vector-icons Мне любопытно, что…
Как я могу передать ответ ‘yes’ при установке npm на Dockerfile
У меня есть Dockerfile, как показано ниже : FROM node:latest RUN npm install something && \ npm install something && \ npm install something Я хочу передать ответ ‘yes’ для всех…
Найдено 4 уязвимости при установке npm
Я только начинаю с react-native. При установке этого пакета npm install —save react-native-validator-form https://github.com/NewOldMax/react-native-validator-form/issues/3 Мне было предложено npm…
Разница между `npm link x ‘ и `npm install /path/to/x`
Я думал, что понимаю разницу между
npm link x
и
npm install /local/path/to/x
первоначально я думал, что первый создал символическую ссылку на x, в то время как второй установил отдельную копию x в вашем проекте, а не символическую ссылку на нее.
Однако недавно я заметил, что мое первоначальное впечатление было неверным, и они оба, похоже, используют символические ссылки — так есть ли разница между ними и в чем она заключается?
node.js
npm
npm-install
npm-link
Поделиться
Источник
Alexander Mills
04 июня 2018 в 05:46
2 ответа
- в чем разница между «npm install» и «npm —userconfig=./.npmrccorp i »
Я хочу знать, в чем разница между этими двумя командами в nodejs npm install и npm —userconfig=./.npmrccorp i Насколько я знаю, оба установят необходимые модули узла, указанные в package.json .
- В чем разница между NPM-g (global) install и NPM —save
В чем разница между npm -g(global) install и npm —save ? Сначала gulp install -g и —save , затем для других проектов: npm i gulp —save-dev могу ли я просто использовать эту команду? Я не знаю основной разницы между ними?
28
В статье о Медиуме Алекса Миллса это изложено голым.
В нем говорится, что разница между npm link x
и npm install /local/path/to/x
составляет:
Большая разница в том, что
npm install /local/path/x
будет
запускать крючки предустановки/постустановки, аnpm link x
-нет.npm link
использует глобальное пространство NPM,npm install /local/path/x
-нет. npm link создает символическую ссылку на x
в глобальном пространстве, а затем, когда вы вызываете npm link x из
y, он создает символическую ссылку не непосредственно на x, а скорее на
глобальную символическую ссылку. Это важное различие, если вы
использование различных глобальных версий node.js, например, NVM.npm install /absolute/path/x
изменит package.json,npm link x
-нет.
Чтобы получить свежую локальную копию вместо символической ссылки, используйте npm pack
, например:
tgz="$PWD/$(npm pack)"
cd <other project>
npm install "$tgz"
Вы также можете использовать cp/rsync,, но это не приведет к запуску установочных крючков или помещению исполняемых файлов в node_modules/.bin
…это сработает.
Поделиться
Alexander Mills
04 июня 2018 в 21:29
6
npm ссылка
npm link
npm link <folder>
Обе вышеприведенные команды создадут символическую ссылку <folder>
в глобальных пакетах.
Теперь npm link <folder>
будет символически ссылаться на то же самое в вашей папке node_modules
также для вашего текущего проекта. И эти имена будут основаны на имени проекта в package.json
, а не на имени папки, которую вы связываете
package.json
вашего текущего проекта не будет затронут или изменен
Зависимости пакета по-прежнему будут установлены, как вы можете видеть в коде здесь
https://github.com/nodejs/node/blob/31d5bdea70e44802918d6f4aa7c378bc1992be54/deps/npm/lib/link.js#L156
Итак, подведем итог
- Он создает символическую ссылку в глобальной папке (всегда)
- Это не меняет package.json
- Он устанавливает любые из отсутствующих зависимостей
npm установить
Теперь npm install <folder>
немного отличается от этого
- Он не создает символическую ссылку в глобальной папке
- Он изменяет и добавляет ссылку на package.json
- Он создает символическую ссылку на исходную папку
Поделиться
Tarun Lalwani
12 июня 2018 в 05:11
Похожие вопросы:
В чем разница между «обновление -г npm», «npm обновление -г», «npm установить -г npm», и «N стабильный»?
Мой npm кажется устаревшим, так что, похоже, я мог бы использовать 4 способа его обновления: sudo npm update -g # => npm 3.8.6 sudo npm upgrade -g # => npm 3.8.7 sudo npm install -g npm sudo…
В чем разница между npm установить и запустить npm строить?
В чем разница между npm install и npm run build ? Я заметил в своем проекте, что иногда npm начинает терпеть неудачу, когда выполняется npm install , но при запуске npm run build он работает просто…
Какие папки npm/bin должны быть в PATH ? (OS X 10.8.2 / npm установлена с homebrew )
Обновление узла с помощью homebrew ==> Downloading http://nodejs.org/dist/v0.8.21/node-v0.8.21.tar.gz ######################################################################## 100.0% ==>…
в чем разница между «npm install» и «npm —userconfig=./.npmrccorp i »
Я хочу знать, в чем разница между этими двумя командами в nodejs npm install и npm —userconfig=./.npmrccorp i Насколько я знаю, оба установят необходимые модули узла, указанные в package.json .
В чем разница между NPM-g (global) install и NPM —save
В чем разница между npm -g(global) install и npm —save ? Сначала gulp install -g и —save , затем для других проектов: npm i gulp —save-dev могу ли я просто использовать эту команду? Я не знаю…
Разница между ‘npm add’ и ‘npm install —save’?
Я искал в интернете и до сих пор не могу понять, есть ли какая-то разница между npm add <package> и npm install —save <package> . Спасибо.
В чем разница между npm install и meteor npm install
Я работаю над Meteor и хочу знать, в чем разница между ними npm install и meteor npm install . Спасибо
Разница между npm install и npm install —save?
В том числе и слово-сохранить означает? или в чем разница между ними: npm install и npm install —save?
В чем разница между ‘npm i’ и ‘npm install’?
В чем разница между командами npm i и npm install ? Оба устанавливают все узловые модули от package.json . Я знаю, что это значит установить. Вполне возможно, что существует некоторая разница между…
разница между командами npm install react-router-dom и npm install —save react-router-dom
разница между командами npm install react-router-dom и npm install —save react-router-dom Я попробовал обе команды и получил один и тот же результат, поэтому не могу понять, в чем фактическая…
npm — npm-link — Synopsis Description Связывание пакетов-это двухступенчатый процесс. Во-первых,
Synopsis
npmlink(in package dir)
npmlink[<@scope>/]<pkg>[@<version>]
alias: npmln
Description
Связывание пакетов-это двухступенчатый процесс.
Во-первых, npm link
в папке пакета создаст символическую ссылку в глобальной папке {prefix}/lib/node_modules/<package>
, которая ссылается на пакет, в котором была выполнена команда npm link
. Он также свяжет любые ячейки в пакете с {prefix}/bin/{name}
. Обратите внимание, что npm link
использует глобальный префикс ( его значение см. В npm prefix -g
).
Затем в другом месте npm link package-name
создаст символическую ссылку от глобально установленного имени- package-name
к node_modules/
текущей папки.
Обратите внимание, что package-name
взято из package.json
, а не из имени каталога.
Имя пакета может иметь префикс области действия. См. scope
. Перед областью видимости должен стоять символ @, за которым следует косая черта.
При создании архивов для npm publish
связанные пакеты «снимаются» до их текущего состояния путем разрешения символических ссылок.
Это удобно для установки собственных вещей,так что вы можете работать над ними и тестировать их итерационно без необходимости постоянно перестраивать.
Например:
cd ~/projects/node-redis
npmlink
cd ~/projects/node-bloggy
npmlink redis
Теперь любые изменения в ~/проектах/узле-редисе будут отражаться в ~/проектах/узле-блогги/узле_модулей/узле-редисе/.Обратите внимание,что ссылка должна быть на имя пакета,а не на имя каталога для этого пакета.
Вы также можете сократить два шага на один.Например,сделать приведенный выше вариант использования короче:
cd ~/projects/node-bloggy
npmlink../node-redis
Вторая строка-это эквивалент действий:
(cd ../node-redis;npm link)
npmlink redis
То есть сначала создается глобальная ссылка, а затем глобальная цель установки node_modules
папкой node_modules вашего проекта .
Обратите внимание, что в этом случае вы имеете в виду имя каталога node-redis
, а не имя пакета redis
.
Если ваш связанный пакет имеет область действия (см. scope
), ваша команда ссылки должна включать эту область, например
npmlink @myorg/privatepackage
См.также
node.js — NPM: после «npm link» модуль не найден
Я разрабатываю два модуля для NodeJS, первый называется aligator
, а второй aligator-methods
. Второй зависит от первого, чтобы работать. Я разрабатываю эти два модуля одновременно, и я хочу глобально связать aligator
, чтобы я мог использовать его, как в реестре npm, и я только что установил его глобально. Для этого в документации NPM сказано, что мне нужно использовать npm link
, но он не работает.
Файл package.json
модуля aligator
:
{
"name": "aligator",
"version": "0.0.1",
"description": "",
"main": "index.js",
"private": true,
"directories": {
"doc": "docs",
"example": "examples",
"test": "spec"
},
"scripts": {
"test": "gulp jasmine"
},
"license": "MIT",
"devDependencies": {
"gulp": "^3.0.0.1"
}
}
Первым делом я связал модуль глобально:
$ cd ~/aligator
$ npm link
/usr/local/lib/node_modules/aligator -> /Users/roc/aligator
Это, если я не ошибаюсь, создало глобальную ссылку на мой модуль aligator
, и теперь я могу использовать этот модуль где угодно на компьютере.
Затем я перешел к другому модулю и попытался установить зависимость, но он дал мне следующий результат:
$ cd ~/aligator-methods
$ npm install
npm ERR! 404 404 Not Found: aligator
npm ERR! 404
npm ERR! 404 'aligator' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of 'aligator-methods'
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.
npm ERR! System Darwin 13.2.0
npm ERR! command "node" "/usr/local/bin/npm" "install"
npm ERR! cwd /Users/roc/aligator-methods
npm ERR! node -v v0.10.28
npm ERR! npm -v 1.4.16
npm ERR! code E404
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /Users/roc/aligator-methods/npm-debug.log
npm ERR! not ok code 0
Я даже пытался связать это напрямую с:
$ cd ~/aligator-methods
$ npm link aligator
/Users/roc/aligator-methods/node_modules/aligator -> /usr/local/lib/node_modules/aligator -> /Users/roc/aligator
Но и это не сработало.
Есть мысли о том, что может происходить? Я где-то читал, что, возможно, это как-то связано с моей установкой node и npm , потому что это было сделано Homebrew, и поэтому иногда мне нужно использовать sudo
, это казалось маловероятным, но я пробовал то, что они предлагали, и это тоже не сработало.
105
Roc
3 Июл 2014 в 13:55
10 ответов
Лучший ответ
Проблема заключалась в том, что свойство main
объекта package.json
указывало на несуществующий файл. Кажется, что проблема может возникнуть по нескольким причинам, поэтому обязательно посмотрите другие ответы.
46
Roc
29 Янв 2020 в 09:54
Я столкнулся с этой проблемой из-за NVM, у меня была одна версия узла для зависимости, а другая для зависимого.
46
linuxdan
6 Дек 2016 в 16:56
Удаление package-lock.json
и запуск npm install
снова решили проблему для меня.
38
Sean Inge Asbjørnsen
14 Ноя 2018 в 11:39
Когда вы впервые запускаете npm link
из каталога aligator
, вы создаете ссылку из вашего глобального каталога node_modules на aligator
. Затем, когда вы запускаете npm link aligator
из каталога aligator-methods
, вы связываете aligator
из локально установленных модулей node_modules с исходным источником (как показано в приведенном выше примере). Как только это будет сделано, больше не будет необходимости в установке, поскольку она уже «установлена». Какие ошибки вы видите после запуска команды npm link aligator
?
Если вы просто хотите установить зависимость из локального каталога, вы можете просто попробовать вместо этого использовать npm install
. Например:
$ cd ~ / методы-алигаторы
$ npm install ../aligator
13
dylants
3 Июл 2014 в 20:47
Моя проблема заключалась в том, что репо A использовало npm
, а репо B использовало yarn
, поэтому мне нужно было запустить yarn link
в репо B, чтобы вытащить его через npm link package-name
в репо A.
8
FrostyDog
6 Янв 2020 в 22:02
Что сработало для меня, так это:
- Удалите
node_modules
как в зависимости, так и в модуле потребителя. - Беги
npm unlink --no-save [dependency-module]
- повторно установите связь с помощью команд с двумя ссылками согласно npm-link
Теперь я могу полностью протестировать свой неопубликованный модуль локально.
Кроме того, существует команда npm pack, которая может помочь вам протестировать неопубликованные модули, хотя и не столь надежна.
npm-pack
6
ishaan
28 Апр 2019 в 21:00
Исправить мою версию этой проблемы; в npm v5.3.0 я удалил node_modules
из репозитория, который связывал с другим проектом.
Я обнаружил, что после npm v3 они пытаются поместить все зависимости node_modules в один каталог node_modules (один в вашем проекте), чтобы максимально сгладить структуру (http://codetunnel.io/npm-5-changes-to-npm-link/).
3
crollywood
8 Дек 2017 в 13:27
Для меня это произошло, когда я уменьшил номер версии своего локального пакета с 0.1.0 до 0.0.1. И в проектах, где я связался с этим пакетом, я все еще использовал более высокий номер версии. Обновление зависимостей в package.json
исправило это.
1
Flion
7 Ноя 2016 в 10:22
Если вы, как и я, изменили tsconfig module
с es5
на esnext
или что-то в этом роде, то значение по умолчанию для moduleResolution
могло измениться.
Если для moduleResolution
не задано значение «node», машинописный текст не будет разрешать пакеты node_modules.
Вы можете прочитать на странице Параметры компилятора о том, как зависит значение по умолчанию от значения module
, значение которого по умолчанию, в свою очередь, зависит от target
, но, вероятно, явно установите его на «узел».
1
Matthias
4 Авг 2020 в 15:10
При использовании peerDependency
Я разрабатываю два пакета: stejs
и stejs-loader
. stejs-loader
имеет stejs
как peerDependency
. Когда я запускал npm link stejs-loader
и npm link stejs
в своем проекте, я получал сообщение об ошибке, которое stejs-loader
не смог найти stejs
. Я исправил это, запустив npm link stejs
в каталоге stejs-loader
.
0
ItsaMeTuni
24 Июн 2020 в 00:04
NPM | JS: Настройка окружения
Установка Node.js добавляет в систему не только интерпретатор, но и несколько важных утилит для работы с JavaScript-проектами. Среди них утилита npm.
# Так можно проверить ее наличие
$ npm --version
6.14.5
npm выполняет множество важных задач, с которыми мы будем знакомиться в течение курса. Сейчас нас интересует ее базовое использование – создание (инициализация) нового проекта. Под проектом понимается код какого-то приложения, например, конкретного сайта.
Для создания нового проекта нужно выполнить две вещи:
- Создать директорию проекта – место, внутри которого будут располагаться все файлы с кодом.C at any time to quit.
package name: (hexlet-hello-world)
В процессе инициализации, npm задаст несколько вопросов на тему того как должен называться проект, какая у него должна быть версия, описание и тому подобное. Все эти вопросы можно смело пропускать, у вас всегда будет возможность поменять ответы.
В конце npm спросит все ли правильно и покажет содержимое файла package.json, который и станет основой нового проекта. После ответа yes этот файл запишется на диск и проект будет считаться готовым к работе.
{ "name": "tmp", "version": "1.0.0", "type": "module", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
package.json — это текстовый файл, внутри которого данные хранятся в JSON формате. Этот формат позволяет описывать данные как пары «ключ-значение», где значением может быть сам JSON. В примере выше — это значение ключа scripts.
Обратите внимание на ключ «type» в JSON выше. Эту часть нужно добавить самостоятельно, исправив файл. Она нужна для работы системы импортов.
npm-ссылка | npm Docs
Synopsis
npm link (in package dir)
npm link [<@scope> /]
[@ ] псевдоним: npm ln
Описание
Связывание пакетов двухэтапный процесс.
Сначала ссылка
npm
в папке пакета создаст символическую ссылку в глобальной папке
{prefix} / lib / node_modules /
, который ссылается на пакет, в которомnpm
команда была выполнена.Он также свяжет любые ячейки в пакете с
Ссылка{prefix} / bin / {name}
.
Обратите внимание, что ссылкаnpm
использует глобальный префикс (см. Его значение в префиксеnpm -g
).Затем, в другом месте,
npm link имя-пакета
создаст
символическая ссылка от глобально установленногоимя-пакета
доnode_modules /
текущей папки.Обратите внимание, что
имя пакета
взято изpackage.json
,
не из имени каталога.Имя пакета может иметь префикс области действия. См. Область применения
Перед областью действия должен стоять символ @, за которым следует косая черта.При создании архивов для
npm publish
связанные пакеты
«снэпшот» до их текущего состояния путем разрешения символических ссылок.Это удобно для установки ваших собственных вещей, чтобы вы могли работать с ними и
тестируйте его итеративно без необходимости постоянно перестраивать.Например:
cd ~ / projects / node-redis
npm link
cd ~ / projects / node-bloggy
npm link redis
Теперь любые изменения в ~ / projects / node-redis будет отражено в
~ / проекты / node-bloggy / node_modules / node-redis /.Обратите внимание, что ссылка должна
быть именем пакета, а не именем каталога для этого пакета.Вы также можете сократить два шага за один. Например, чтобы сделать
приведенный выше вариант использования в более коротком виде:cd ~ / projects / node-bloggy
npm link ../node-redis
Вторая строка эквивалентна действию:
(cd ../ node-redis; npm link)
npm link redis
То есть сначала создает глобальную ссылку, а затем связывает глобальную
цель установки в папку вашего проектаnode_modules
.Обратите внимание, что в этом случае вы имеете в виду имя каталога,
node-redis
,
вместо имени пакетаredis
.Если ваш связанный пакет имеет область действия (см. Область
npm link @ myorg / privatepackage
См. Также
Общие сведения о npm-link. Написание кода приложения и зависимости… | Франциска Хинкельманн | DailyJS
Одновременная работа с приложением и зависимостью
Иногда вам нужно работать над кодом приложения и зависимостью одновременно.Возможно, вы являетесь автором зависимости, и у вас еще нет хорошего тестового покрытия. Приложение может служить сквозным тестом зависимости. Возможно, вам нужно отладить проблему в вашем приложении, и проблема, похоже, связана с источниками зависимостей.
Вы можете внести изменения в
node_modules
и вручную скопировать изменения в репозиторийgit
зависимости, как только вы закончите. Но есть более чистый подход:npm link
.Использование
Связывание пакетов — это двухэтапный процесс:
- Создайте глобальную символическую ссылку для зависимости с помощью
npm link
.Символическая ссылка , сокращение от символической ссылки, — это ярлык, который указывает на другой каталог или файл в вашей системе. - Укажите приложению использовать глобальную символическую ссылку с
npm link some-dep
.
cd ~ / projects / some-dep
npm link # Шаг 1.
cd ~ / projects / my-app
npm link some-dep # Шаг 2.Вы можете редактировать, транспилировать, запускать тесты или фиксировать как обычно в
какой-то деп
. В то время какmy-app
работает с изменениями, внесенными вами вsome-dep
.Символические ссылки являются локальными и не будут привязаны кgit
. Когда вы будете готовы поделиться своим кодом, опубликуйте новую версиюsome-dep
или нажмите в ветку, указанную вmy-app
package.json :cd ~ / projects / my- app
npm install - save some-dep @ fhinkel / some-dep # experimental-branchDebugging
Если вы используете VSCode и хотите установить точки останова в
some-dep
, вам необходимо включить символические ссылки в отладчике длямое приложение
.Сделайте это, установив«runtimeArgs»: [
«--preserve-symlinks»
]в
launch.json
.Включить символические ссылки в конфигурации отладки в коде
Вернуться к нормальному состоянию
Как вернуться к нормальным зависимостям ? Если вы больше не хотите использовать локальную версию
some-dep
, удалите символическую ссылку. Но будьте осторожны,npm unlink
— это псевдоним дляnpm uninstall
, он не отражает поведениеnpm link
.cd ~ / projects / my-app
npm uninstall --no-save some-dep && npm installВы можете очистить глобальную ссылку, хотя ее наличие не будет мешать работе
my-app
.cd ~ / projects / some-dep
npm uninstall # Удалить глобальную символическую ссылкуЗаключение
Я использовал
npm link
при работе над зависимостями клиентских библиотек для Google Cloud Platform. Все наши библиотеки используют модуль@ google-cloud / common
.В некоторых случаях мне нужно было сразу увидеть изменения в более крупных библиотеках, а не изолированно вобщем
.Освоение двухэтапного процесса
npm link
— полезное дополнение к набору инструментов любого разработчика Node.js. Процесс состоит из запускаnpm link
в зависимости иnpm link some-dep
в приложении.Огромное спасибо Питеру Маршаллу и Александру Фенстеру за помощь в редактировании этого сообщения.
Использование npm-ссылки для использования узловых модулей, которые «в процессе»
[00:00] Иногда вам нужно использовать модуль до его публикации или до того, как вы будете готовы опубликовать его новую версию. NPM предоставляет команду под названием «ссылка», которая полезна именно для этой цели. В данном случае у нас есть модуль с именем «upper», который обладает удивительной функциональностью, позволяя принимать строку и возвращать ее версию в верхнем регистре. Он находится здесь, в этом верхнем каталоге, и мы хотим использовать его из этого пользовательского каталога.
[00:29] Наш индексный файл и пользователь просто запрашивают верхний уровень, а затем выходят из системы, передав ему строку «Hello World». Здесь мы находимся в каталоге пользователя, поэтому, если мы попытаемся использовать это, мы получим эту ошибку, которая говорит: «Не удается найти модуль ‘upper’». Это потому, что мы его не установили. На самом деле, мы не можем его установить, потому что верхний нигде не публиковался.
[00:54] Но есть способ обойти это, и он состоит в том, чтобы перейти в верхний каталог и затем сказать «ссылка npm», и ссылка npm, которую вы видите, создаст символическую ссылку в user / local / lib / node modules / upper в тот каталог, в котором мы только что были.Теперь мы создали эту символьную ссылку в нашей системе, поэтому, если мы вернемся в каталог пользователя, теперь мы должны сказать ему, что мы хотим, чтобы он использовал это местоположение.
[01:30] Мы скажем «npm link upper», и вы увидите, что затем будет создана трехэтапная символическая ссылка. Он свяжет каталог node modules / upper в нашем пользовательском каталоге с тем местом, где мы создали символическую ссылку на последнем шаге, которая затем, конечно же, указывает на сам Upper. Теперь мы действительно можем запустить наш индексный файл, который использует Upper, и мы увидим, что вывод «Hello World.»
[02:05] Одна вещь, которую следует отметить, особенно если вы используете Mac, заключается в том, что когда вам это нужно, ваш модуль был опубликован, или вы только что закончили с этим проектом, независимо от В таком случае вам следует отсоединить этот модуль, потому что он может вызвать проблемы с такими вещами, как Time Machine, которые довольно сложно отследить. Если затем мы просто скажем «npm unlink upper», вы увидите, что он отменяет сборку этой ссылки , и теперь, если мы снова запустим нашу программу, мы снова получим эту ошибку.
[02:40] Используйте ссылку npm без аргументов в каталоге модуля, который вы хотите предоставить другим модулям, а затем ссылку npm с тем именем модуля, в котором вы хотите его использовать.Следует отметить, что команда npm link требует наличия файла package.json, потому что она фактически будет использовать поле имени оттуда для создания этой ссылки.
javascript — Установка локального модуля с помощью npm?
Итак, у меня было много проблем со всеми упомянутыми до сих пор решениями …
У меня есть локальный пакет, на который я хочу всегда ссылаться (а не на ссылку npm), потому что он не будет использоваться вне этого проекта (на данный момент), а также не будет загружен в репозиторий npm для широкого использования. .
Мне также нужно, чтобы он работал в Windows И Unix, поэтому символьные ссылки не идеальны.
Указание на результат tar.gz (пакет npm) работает для зависимой папки пакета npm, однако это вызывает проблемы с кешем npm, если вы хотите обновить пакет. Он не всегда извлекает новый из указанного пакета npm при его обновлении, даже если вы удалите node_modules и повторно выполните установку npm-install для вашего основного проекта.
так .. Это то, что у меня хорошо сработало!
Основной пакет проекта.json Фрагмент файла:
"имя": "название-основного-проекта", "версия": "0.0.0", "scripts": { «нг»: «нг», ... "preinstall": "cd ../some-npm-package-angular && npm install && npm run build" }, "частный": правда, "dependencies": { ... "@ com / some-npm-package-angular": "файл: ../ some-npm-package-angular / dist", ... }
Этим достигается 3 вещи:
- Избегает распространенной ошибки (по крайней мере, в проектах angular npm) index.ts не является частью компиляции. «- поскольку он указывает на папку build (dist).
- Добавляет этап предварительной установки для сборки указанного клиентского пакета npm, чтобы убедиться, что создана папка dist нашего зависимого пакета.
- Избегает проблем, когда ссылка на файл tar.gz локально может быть кэширована npm и не обновлена в основном проекте без большой очистки / устранения неполадок / перекомпоновки / переустановки.
Надеюсь, это понятно и кому-то поможет.
Деготь.гз подход тоже вроде работает ..
npm install (путь к файлу) тоже вроде работает.
Все это было основано на сгенерированном клиенте из спецификации openapi, который мы хотели сохранить в отдельном месте (вместо того, чтобы использовать копировальную пасту для отдельных файлов).
======
ОБНОВЛЕНИЕ:
======При обычном процессе разработки с вышеуказанным решением возникают дополнительные ошибки, так как схема управления версиями npm с локальными файлами абсолютно ужасна.Если ваш зависимый пакет часто меняется, вся эта схема нарушается, потому что npm будет кэшировать вашу последнюю версию проекта, а затем взорвется, когда хеш SHA больше не совпадает с тем, что было сохранено в вашем файле package-lock.json, среди других проблем .
В результате я рекомендую использовать подход * .tgz с обновлением версии для каждого изменения. Это работает за счет трех вещей.
Первый:
Для вашего зависимого пакета используйте библиотеку npm «ng-packagr».Это автоматически добавляется в автоматически сгенерированные клиентские пакеты, созданные генератором кода angular-typescript для OpenAPI 3.0.
В результате в проекте, на который я ссылаюсь, есть раздел «сценарии» в package.json, который выглядит следующим образом:
"скриптов": { "build": "ng-packagr -p ng-package.json", "пакет": "npm install && npm run build && cd dist && npm pack" },
И проект, ссылающийся на этот другой проект, добавляет этап предварительной установки, чтобы убедиться, что зависимый проект обновлен и перестроен перед сборкой:
"скриптов": { "preinstall": "npm run clean && cd../some-npm-package-angular && npm run package " },
Второй
Ссылка на встроенный пакет tgz npm из вашего основного проекта!
"зависимости": { "@ com / some-npm-package-angular": "файл: ../ some-npm-package-angular / dist / some-npm-package-angular-
.tgz", ... } Третий
Обновляйте версию зависимого пакета КАЖДЫЙ раз, когда вы обновляете зависимый пакет. Вам также необходимо обновить версию в основном проекте.
Если вы этого не сделаете, NPM будет задыхаться и использовать кэшированную версию и взорваться, когда хэш SHA не совпадает. NPM версии файловых пакетов на основе изменения имени файла. Он не будет проверять сам пакет на наличие обновленной версии в package.json, и команда NPM заявила, что они не будут это исправлять, но люди продолжают поднимать проблему: https://github.com/microsoft/WSL/issues/ 348
сейчас, просто обновите:
"версия": "1.0.0-build5",
В пакете зависимого пакета.json, а затем обновите ссылку на него в основном проекте, указав новое имя файла, например:
.
"зависимости": { "@ com / some-npm-package-angular": "файл: ../ some-npm-package-angular / dist / some-npm-package-angular-1.0.0-build5.tgz", ... }
К этому привыкаешь. Просто обновите два файла package.json — версию, а затем ссылку на новое имя файла.
Надеюсь, что кому-то поможет …
node.js — NPM: после «npm link» модуль не найден
Я разрабатываю два модуля для NodeJS: первый называется
aligator
, а второй —aligator-methods
.Второй зависит от первого, чтобы работать. Я разрабатываю эти два модуля одновременно, и я хочу глобально связатьaligator
, чтобы я мог использовать его, как в реестре npm, и я только что установил его глобально. Для этого в документации NPM указано, что мне нужно использовать ссылкуnpm
, но она не работает.Файл
package.json
модуляaligator
:{ "имя": "алигатор", "версия": "0.0.1", "описание": "", "main": "index.0,0.1 " } }
Первым делом я связал модуль глобально:
$ cd ~ / aligator ссылка $ npm / usr / local / lib / node_modules / aligator -> / Users / roc / aligator
Это, если я не ошибаюсь, создало глобальную ссылку на мой модуль
aligator
, и теперь я могу использовать этот модуль где угодно на компьютере.Затем я перешел к другому модулю и попытался установить зависимость, но он дал мне следующий результат:
$ cd ~ / aligator-methods $ npm install npm ERR! 404 404 Не найдено: аллигатор npm ERR! 404 npm ERR! 404 'aligator' отсутствует в реестре npm.npm ERR! 404 Вы должны поставить автора на ошибку, чтобы опубликовать это npm ERR! 404 Это было указано как зависимость 'aligator-methods' npm ERR! 404 npm ERR! 404 Обратите внимание, что вы также можете установить из npm ERR! 404 tarball, папка, URL-адрес http или URL-адрес git. npm ERR! Система Дарвина 13.2.0 npm ERR! команда "узел" "/ usr / local / bin / npm" "установить" npm ERR! cwd / Пользователи / roc / aligator-methods npm ERR! узел -v v0.10.28 npm ERR! npm -v 1.4.16 npm ERR! код E404 npm ERR! npm ERR! Дополнительные сведения о ведении журнала можно найти в: npm ERR! / Пользователи / roc / aligator-methods / npm-debug.бревно npm ERR! не в порядке код 0
Я даже пытался связать его напрямую с:
$ cd ~ / aligator-methods $ npm ссылка aligator / Пользователи / roc / aligator-methods / node_modules / aligator -> / usr / local / lib / node_modules / aligator -> / Users / roc / aligator
Но и это не сработало.
Есть мысли о том, что может происходить? Я где-то читал, что, возможно, это как-то связано с моей установкой узла и npm , потому что он был сделан Homebrew, и поэтому иногда мне нужно использовать
sudo
, это казалось маловероятным, но я пробовал то, что они предлагали, и Это тоже не сработало.Использование npm-link для разработки пакетов — Terodox.tech
Изображение на обложке: JJ Ying
При написании значительного количества вызовов API на javascript я разочаровывался в процессе проверки полезной нагрузки каждого вызова. Работая с моей командой, мы придумали небольшой простой метод, который позволил бы нам написать класс для каждого ответа API, а затем
принудить
ответ к этому классу.Этот код универсален, и, скопировав его в несколько проектов, мы знали, что пришло время для пакета npm.
Все эти варианты использования были отправлены в производство, поэтому нам нужен был безопасный способ извлечь эту небольшую функцию в пакет и проверить, правильно ли она работает, прежде чем снова отправить в производство.
npm-link
в помощьnpm link
предоставляет инструменты, необходимые как для разработки, так и для локального использования пакета npm.Мы начали с создания нового модуля npm под названием
@ meltwater / coerce
. Этот модуль содержал простой метод из 10 строк, который мы использовали для приведения типов на основе классов.Локальный пакет npm
Нам нужно сделать модуль доступным для локальной установки.
компакт-диск локальный / git / папка / coerce npm ссылка
Результат этого помогает нам понять, что на самом деле здесь происходит.
/ путь / к / global / node / modules / node_modules / @ meltwater / coerce -> / local / git / folder / coerce
В нашей глобальной папке
node_modules
была создана символическая ссылка, которая указывает на нашу локальную версию принуждения. Обратите внимание, что имя пакета используется в папкеnode_modules
.Это будет соответствовать полюname
в вашем package.json.Использование локального пакета npm
Теперь нам нужно сослаться на вновь созданную ссылку из проекта, из которого мы удаляем этот код.
компакт-диск локальный / git / folder / main-project npm link @ талая вода / coerce
Обратите внимание, что мы ссылаемся на имя пакета, а не на имя папки! Проверив вывод еще раз, мы увидим цепочку символических ссылок:
/ local / git / folder / main-project / node_modules / @ meltwater / coerce -> / path / to / global / node / modules / node_modules / @ meltwater / coerce -> / local / git / folder / coerce
Теперь, когда мы создали ссылку в основном проекте, протестировать ее локально так же просто, как заменить ссылки в наших файлах из:
принуждение к импорту из '../coerce ';
С
по
принуждение к импорту из "@ meltwater / coerce";
Теперь все наши тесты должны пройти, и мы можем быть уверены, что извлечение нашего кода прошло успешно.
Уборка, когда мы закончили
Теперь, когда мы протестировали и все в порядке, мы должны очистить нашу локальную среду. Подобно
npm link
, есть командаnpm unlink
, и она работает точно так, как вы ожидаете.компакт-диск локальный / git / папка / coerce npm unlink
В основном проекте нам нужно разорвать связь, но нам также нужно сослаться на недавно опубликованный пакет:
компакт-диск локальный / git / folder / main-project npm un`link @ meltwater / coerce npm i @ талая вода / coerce
Краткое описание
npm link
дает нам инструменты, необходимые как для записи, так и для проверки пакетов npm локально. Это очень простой инструмент, который дает нам отличный способ проверить любой новый или обновленный пакет перед публикацией.Как использовать npm link для разработки общих компонентов
Почему «ссылка npm»?
Если вы работаете над проектом node , может наступить момент, когда ваше приложение будет зависеть от другого созданного вами настраиваемого модуля.
Готовы вдохновиться?
Спасибо за регистрацию
Подпишитесь на нашу новостную рассылку, чтобы получать советы экспертов и вдохновляющие примеры
Ваше приветственное письмо уже в пути! Вы можете выбрать электронные письма, которые хотите получать, щелкнув ссылку в Центре настроек.
Например, у одного из наших клиентов мы с моими коллегами отвечаем за общий компонент под названием Search Component . Как и многие из «общих» библиотек, используемых в этом конкретном проекте, Search Component публикуется и доступен из частного репозитория Artifactory. Его можно вставить в любом месте приложения (обычно в заголовок), что позволяет пользователю легко выполнять поиск по содержимому сайта и мгновенно просматривать сводку результатов.
Вверху: компонент поиска — это настраиваемый узел узла, который можно вставить в любое место родительского приложения
Хотя автоматическое тестирование, безусловно, имеет место, когда дело доходит до работы с общими компонентами, особенно с теми, которые доступны пользователю, ручное тестирование может дать некоторые преимущества. Когда вы находитесь на ранних этапах реализации функции или пика, иногда имеет смысл вручную протестировать влияние ваших изменений на уровне пользовательского интерфейса и выполнить соответствующие итерации.После стабилизации можно (и нужно) проводить надежные тесты.
Это было особенно верно для меня, когда дело дошло до работы с Search Component . После того, как приложение было запущено, изменение Search Component на месте после этого не привело бы к каким-либо наблюдаемым изменениям , а не .
К счастью, диспетчер пакетов узлов ( npm ) может значительно упростить разработку с зависимостями с помощью команды
npm link
.в двух словах о npm link
Документация npm определяет npm link как ‘означает символическую ссылку на папку пакета’ . Проще говоря, это средство для подключения вашего родительского приложения к модулю, который у вас есть локально на вашем компьютере. Когда вы запускаете приложение, любые изменения, которые вы вносите в зависимость, будут отражены в приложении.
Как «ссылка npm»
В терминале перейдите в папку зависимости, которую вы хотите изменить, и выполните команду
npm link
.Это делает компонент глобально доступным для остальной части вашего приложения.Перейдите к папке родительского приложения (т.е. той, которая зависит от модуля, который вы хотите изменить). В корне выполните команду
npm link [имя модуля, который вы хотите изменить]
Затем запустите и родительское приложение, и зависимость модуля, затем начните вносить изменения в зависимость в соответствии с вашими пожеланиями. Кроме того, использование библиотеки, которая отслеживает изменения в вашем коде и перестраивает ваше приложение, например Nodemon, будет иметь важное значение для того, чтобы избавить вас от постоянного перезапуска приложения.
Наконец, когда у вас есть все изменения (плюс тесты!), Перейдите в папку родительского приложения и отключите зависимость, используя
npm unlink [имя модуля, который вы изменили]
. Это удалит локальную зависимость от родительского приложения. Точно так же перейдите в папку зависимости, которую вы изменили, и запуститеnpm unlink
, чтобы больше не делать модуль глобально доступным.
- Создайте глобальную символическую ссылку для зависимости с помощью