npm установка и сборка разветвленного репозитория github


126

Это не совсем новый вопрос, но я уже давно осмотрелся, и у меня возникли проблемы с поиском решения.

Я использую модуль для своего углового приложения под названием 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. Хотел бы получить отзывы по этой проблеме. Кажется, это может быть достаточно распространенной проблемой, когда необходимо внести изменения в исходный код пакета? Может есть решение получше? Заранее спасибо за вашу помощь.

Ответы:


141

Попробуйте npm install <ghusername>/<repoName>, где <ghUsername>ваше имя пользователя GitHub (без символа @) и <repoName>имя репозитория. Это должно правильно установить его. Скорее всего, вы захотите использовать флаг --saveили --save-devс командой установки, чтобы сохранить зависимость в вашем package.json.

Если это работает неправильно, проверьте содержимое вашего .npmignoreфайла.

Не паникуйте, если команда установки занимает много времени; установка из репозитория git происходит медленнее, чем установка из реестра npm.


Редактировать:

Ваша проблема в том, что в вашем случае dist/он не привязан к репо (поскольку он находится в .gitignore). Вот где живет настоящий код. dist/создается из файлов src/до публикации пакета в реестре npm, но dist/никогда не фиксируется в репо.

Это некрасиво, но в этом случае вам придется удалить dist/из, .gitignoreа затем запустить:

npm run build
git add .
git commit
git push

(Убедитесь, что вы бежали npm installпервым)

После этого вы сможете установить его с github.

Возможно, есть другой способ сделать это с помощью postinstallсценария, но я не уверен, что это возможно; Никогда не пробовал.


2
Да, это было в значительной степени решение. Также пришлось выполнить установку npm и немного изменить GruntFile, но это заставило его работать. Спасибо за помощь :)
hughesjmh

2
Неужели нет другого выхода, кроме unignore dist? Я хочу сделать пиар оригинальному репо, но с дистрибутивом ему это не понравится?
Ka Mok

7
@KaMok Я думаю, что еще один вариант - переименовать в package.jsonфайле вашей вилки в . Кажется, что когда или (и то же самое для пряжи) выполняется, он также запускает то, что находится в скрипте. Предполагается, что сценарий этого пакета создает файлы сборки, что обычно и имеет место. scriptsprepublishpreparenpm installnpm install github:user_name/fork_name --saveprepareprepublish
Дэвидфрансиско

5
и если вам нужна конкретная ветка,npm install <ghusername>/<repoName>#branchName
DrMeers

2
@RyanZim Вы не правы. Установка из git работает очень хорошо, если она настроена правильно. docs.npmjs.com/cli/install «Если устанавливаемый пакет содержит prepareсценарий, его dependenciesи devDependenciesбудут установлены, и сценарий подготовки будет запущен до того, как пакет будет упакован и установлен».
Кэмерон Тэклинд

15

Обновление для тех, кто использует npm 5:

Начиная с npm @ 5 prepublishскрипты устарели.

Используйте prepareдля этапов сборки и только prepublishOnlyдля загрузки.

Я обнаружил, что добавление "prepare": "npm run build"к скриптам устранило все мои проблемы.


У меня это тоже сработало (в вилке, которую я только что сделал) - спасибо! Интересно ... почему не все пакеты по умолчанию просто включают эту конфигурацию скрипта? Это потому, что авторы пакетов рассматривают только вариант использования установки своего пакета из npm, а не случай его установки из репозитория git? Значит, они просто привыкли запускаться вручную npm run buildи npm run publishне сталкиваются с какими-либо проблемами или болью, если когда-нибудь не попытаются установить репо через git?
Тайлер Рик

9

Код, опубликованный на 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).

prepare: Запустите как ПЕРЕД тем, как пакет будет упакован и опубликован, локально npm installбез каких-либо аргументов и при установке зависимостей git.

Вы даже можете поместить в него зависимости сборки, 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


1
PREPARE работал у меня вместо POSTINSTALL. Я просто запустил npm run build в prepare.
Milind

6

Использование отличного ответа @RyanZim, postinstallбезусловно , является подходящим вариантом для этого.

Либо выполните одно из следующих действий:

  1. Обновите package.json в своем разветвленном репо, чтобы добавить в скрипты элемент postinstall. Здесь запустите все, что вам нужно, чтобы получить скомпилированный вывод (предпочтительно).
  2. Обновите свой package.json и добавьте постинсталляцию, которая обновляет необходимый каталог в node_modules.

Если вы разветвили репозиторий другого человека, то, возможно, стоит поднять проблему, чтобы проиллюстрировать проблему, заключающуюся в том, что установка их пакета через GitHub не работает, поскольку не предоставляет необходимых средств для сборки скрипта. Оттуда они могут либо принять PR для решения этой проблемы с помощью постустановки, либо отклонить его, и вы можете сделать №2.


Можете ли вы объяснить или у вас есть какие-либо ресурсы о том, как сделать №2? Какие команды мне нужно запускать после установки npm, когда gitrepo содержит только src, а не dist
Даниэль

1
@ Дэниел Извинения, я пытаюсь вспомнить контекст, в котором я делал это в прошлом. Я думаю, что под №2 я имел в виду добавить шаг после установки в ваш основной файл packages.json, который запускал бы шаги для верхнего ответа, поэтому что-то вроде того, "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"чтобы гарантировать, что пакет, вызывающий у вас проблемы, будет создан до запуска вашего приложения. Как уже было сказано, я предпочитаю разветвление репо для моего собственного пользователя, добавление постинсталляции в сам пакет и использование его в моем приложении.
Mike B

Я думаю, что добавление для подготовки должно быть предпочтительным (ответ @Simon), потому что при установке из npm вам не нужно будет делать никаких дополнительных сборок, потому что он уже должен включать dist / dir. См. Docs.npmjs.com/misc/scripts : «Подготовка: запускайте оба ДО того, как пакет будет упакован и опубликован, ... и при установке зависимостей git»
Тайлер Рик

postinstallодин шаг до правильного решения. Просто используйте prepare. Это 2020 год.
Кэмерон Тэклинд

2

Просто используйте команду npm install git+https://git@github.com/myRepo/angular-translate.git. Спасибо.

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