npm встановити та скласти роздвоєний github repo


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. Будемо раді отримати відгуки з цього приводу. Здається, це може бути досить поширеною проблемою, коли потрібно внести зміни до вихідного коду пакета? Можливо, є краще рішення? Заздалегідь дякую за вашу допомогу.

Відповіді:


140

Спробуйте 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? Я хочу зробити PR до оригінального репо, але з dist, він йому не сподобається?
Ка Мок

7
@KaMok Я думаю, що ще один варіант - у package.jsonфайлі вашої вилки, під scripts, перейменувати prepublishна prepare. Здається, коли npm installабо npm install github:user_name/fork_name --save(і те саме для пряжі) виконується, він також виконує те, що в prepareсценарії. Це за умови, що prepublishсценарій цього пакета створює файли збірки, як правило.
davidfrancisco

5
і якщо вам потрібна конкретна галузь,npm install <ghusername>/<repoName>#branchName
DrMeers

2
@RyanZim Ви неправі. Установка з git працює дуже добре, якщо вона налаштована належним чином. docs.npmjs.com/cli/install «Якщо пакет встановлюється містить prepareскрипт, його dependenciesі devDependenciesбуде встановлено, і підготувати сценарій буде виконуватися до того , як пакет упакований і встановлено.»
Cameron Tacklind

15

Оновлення для тих, хто використовує npm 5:

Станом на npm @ 5, prepublishсценарії застарілі.

Використовуйте prepareдля етапів складання та лише prepublishOnlyдля завантаження.

Я знайшов додавання "prepare": "npm run build"до скриптів виправити всі мої проблеми.


Це теж працювало для мене (у вилці, яку я щойно зробив) - дякую! Мені цікаво ... чому всі пакети просто не включають цю конфігурацію сценарію за замовчуванням? Це тому, що автори пакунків розглядають лише випадок використання установки свого пакету з npm, а не випадок встановлення його з git repo? Отже, вони просто використовуються для запуску вручну 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 і Пряжа зберігатимуть лише ті файли, які вказані у filesрозділі package.json.

Можливо, можна побачити, що filesза замовчуванням всі файли включаються і думають, що вони виконані. Що легко пропустити, це те, що в .npmignore основному переорієнтовує filesдирективу, а якщо .npmignoreвона не існує, .gitignoreвикористовується замість цього.

Отже, якщо у вас вбудовані файли перелічені .gitignoreяк розумна людина, і нічого іншого не робити, prepareвони здадуться зламаними

Якщо ви вирішите filesвключити лише вбудовані файли або додати порожні .npmignore, все налаштовано.

Моя рекомендація полягає в тому, щоб встановити files(або шляхом інверсії .npmignore) таким чином, що єдиними фактично опублікованими файлами є ті, які потрібні користувачам опублікованого пакету. Імхо, немає необхідності включати некомпільовані джерела у опубліковані пакети.


Оригінальна відповідь: https://stackoverflow.com/a/57503862/4612476


1
ПІДГОТОВКА працювала для мене замість POSTINSTALL.i щойно запустила npm run build у підготовці.
Milind

6

Відмовити від чудової відповіді @ RyanZim, postinstallбезумовно, вірний варіант для цього.

Виконайте одну з наступних дій:

  1. Оновіть package.json у своєму роздвоєному репо, щоб додати елемент післявстановлення до сценаріїв. Тут запустіть все, що потрібно, щоб отримати компільований вихід (бажаний).
  2. Оновіть пакунок.json і додайте постінсталяцію, яка оновлює необхідний каталог у node_modules.

Якщо ви розпрощалися з іншим сховищем, можливо, варто поставити питання, щоб проілюструвати проблему, що встановлення їх пакету через GitHub не працює, оскільки не забезпечує необхідних засобів для створення сценарію. Звідти вони можуть або прийняти PR, щоб вирішити це з постінсталією, або вони можуть відхилити його, і ви можете зробити №2.


Чи можете ви пояснити чи мати якийсь ресурс щодо того, як зробити №2? Які команди мені потрібно запустити після встановлення npm, коли gitrepo містить лише src не dist
Daniel

1
@ Даніель Вибачення, я намагаюся згадати контекст, де я це робив у минулому. Я думаю, що під №2 я мав намір додати основний крок після встановлення до вашого основного пакета.json, який би виконував кроки для вищої відповіді, тож щось в порядку, "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"щоб переконатися, що пакет, який заподіює вам проблеми, буде побудований до запуску програми. Як було сказано, я вважаю за краще підходити до передачі репо до власного користувача, додавання післяустановки до самого пакету та використання цього в моїй програмі.
Майк Б

Я думаю, що слід віддати перевагу додаванню для підготовки (відповідь @ Simon), тому що якщо ви встановлюєте з npm, вам не потрібно буде робити жодних додаткових будівель, оскільки це вже повинно містити dist / dir. Дивіться docs.npmjs.com/misc/scripts : "підготуйтеся: запустіть обидва, перш ніж пакет упакований і опублікований, ... і при встановленні залежностей від git"
Тайлер Рік

postinstallє на крок від правильного рішення. Просто використовуйте prepare.
Настає

2

Просто використовуйте команду npm install git+https://git@github.com/myRepo/angular-translate.git. Дякую.

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