Это не совсем новый вопрос, но я уже давно осмотрелся, и у меня возникли проблемы с поиском решения.
Я использую модуль для своего углового приложения под названием angular-translate. Однако мне пришлось внести несколько небольших изменений в исходный код, чтобы все работало так, как я хотел, и теперь я хочу сохранить эти изменения npm install
. Коллега предложил мне форкнуть репо исходного кода и указать на мое разветвленное репо как зависимость, которую я пробовал такими способами, например
npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz
Первый дает мне такой каталог без сборки. Просто package.json, .npmignore и некоторые файлы уценки
-angular-translate
.npmignore
.nvmrc
CHANGELOG.md
package.json
etc
Второй npm install
дает мне полное репо, но я снова не получаю сборки, как когда я использую команду npm install angular-translate
. Я видел некоторые обсуждения запуска сценария предварительной публикации, но я не уверен, как это сделать при установке всех модулей. Я также пробовал опубликовать вилку как свой собственный модуль в реестре npm, но снова у меня нет сборки, и я не уверен, что это правильно ...
Прошу прощения за свое незнание темы. У меня нет большого опыта работы с npm. Хотел бы получить отзывы по этой проблеме. Кажется, это может быть достаточно распространенной проблемой, когда необходимо внести изменения в исходный код пакета? Может есть решение получше? Заранее спасибо за вашу помощь.
источник
package.json
файле вашей вилки в . Кажется, что когда или (и то же самое для пряжи) выполняется, он также запускает то, что находится в скрипте. Предполагается, что сценарий этого пакета создает файлы сборки, что обычно и имеет место.scripts
prepublish
prepare
npm install
npm install github:user_name/fork_name --save
prepare
prepublish
npm install <ghusername>/<repoName>#branchName
prepare
сценарий, егоdependencies
иdevDependencies
будут установлены, и сценарий подготовки будет запущен до того, как пакет будет упакован и установлен».Обновление для тех, кто использует npm 5:
Я обнаружил, что добавление
"prepare": "npm run build"
к скриптам устранило все мои проблемы.источник
npm run build
иnpm run publish
не сталкиваются с какими-либо проблемами или болью, если когда-нибудь не попытаются установить репо через git?Код, опубликованный на npmjs.com, часто отличается от того, что находится в репозитории пакета. Обычно исходные файлы JavaScript "компилируются" в версии, предназначенные для общего использования в библиотеках. Это то, что обычно публикуется на npmjs.com.
Это настолько распространено, что это функция
npm
автоматического запуска шага «сборки» перед публикацией (npm publish
). Первоначально это называлосьprepublish
. Похоже, что Npm подумал, что было бы удобно запуститьprepublish
скрипт и на сервере,npm install
поскольку это был стандартный способ инициализации среды разработки.Это привело к серьезному замешательству в сообществе. На github есть очень длинные вопросы по этому поводу.
В конце концов, чтобы не менять старое поведение, они решили добавить еще два автоматических скрипта:
prepublishOnly
иprepare
.prepublishOnly
делает то, что вы ожидаете. Не запускаетсяnpm install
. Многие разработчики пакетов просто слепо перешли на это.Но была еще одна проблема: люди не хотели зависеть от npmjs.com в распространении версий пакетов. Репозитории Git были естественным выбором. Однако распространенной практикой является не фиксировать "скомпилированные" файлы в git. Вот что
prepare
добавили в ручку ...prepare
правильный путьЕсли у вас есть репозиторий с исходными файлами, но для его использования необходим этап «сборки», он
prepare
делает именно то, что вы хотите, во всех случаях (начиная с npm 4).Вы даже можете поместить в него зависимости сборки,
devDependencies
и они будут установлены доprepare
выполнения.Вот пример моего пакета, в котором используется этот метод.
Проблемы с
.gitignore
У этого варианта есть одна проблема, которая волнует многих. При подготовке зависимости Npm и Yarn сохранят только файлы, перечисленные в
files
разделеpackage.json
.Можно увидеть, что по
files
умолчанию включены все файлы, и подумать, что все готово. Что легко упустить, так это то, что в.npmignore
основном переопределяетfiles
директиву и , если.npmignore
не существует,.gitignore
используется вместо нее .Итак, если у вас есть созданные вами файлы, перечисленные
.gitignore
как нормальный человек, и вы больше ничего не делаете, ониprepare
будут казаться сломаннымиЕсли вы исправите,
files
чтобы включить только созданные файлы или добавить пустой.npmignore
, все готово.Я рекомендую установить
files
(или путем инверсии.npmignore
) так, чтобы фактически публикуемые файлы были только теми, которые необходимы пользователям опубликованного пакета. Имхо, нет необходимости включать некомпилированные исходники в опубликованные пакеты.Оригинальный ответ: https://stackoverflow.com/a/57503862/4612476
источник
Использование отличного ответа @RyanZim,
postinstall
безусловно , является подходящим вариантом для этого.Либо выполните одно из следующих действий:
Если вы разветвили репозиторий другого человека, то, возможно, стоит поднять проблему, чтобы проиллюстрировать проблему, заключающуюся в том, что установка их пакета через GitHub не работает, поскольку не предоставляет необходимых средств для сборки скрипта. Оттуда они могут либо принять PR для решения этой проблемы с помощью постустановки, либо отклонить его, и вы можете сделать №2.
источник
"postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"
чтобы гарантировать, что пакет, вызывающий у вас проблемы, будет создан до запуска вашего приложения. Как уже было сказано, я предпочитаю разветвление репо для моего собственного пользователя, добавление постинсталляции в сам пакет и использование его в моем приложении.postinstall
один шаг до правильного решения. Просто используйтеprepare
. Это 2020 год.Просто используйте команду
npm install git+https://git@github.com/myRepo/angular-translate.git
. Спасибо.источник