[Из песочницы] Локальный (offline) npm репозиторий
Предыстория
Решив продаться задорого, я оказался у работодателя, где интернета нет не только в пром-контуре, но и в деве (ситуация на самом деле нередкая во многих, так сказать, «энтерпрайзах»). Есть IE в консоли, где ты, мой дорогой читатель, можешь конечно посмотреть на Хабр или stackoverflow, но не более. В целом, повторюсь, ситуация не исключительная, с ней можно жить — вот он, мой личный ноут, на котором я это пишу, стоит на столе… wifi ли, поднимаемый многими сотрудниками, сотовый ли как модем, в целом, если это не оборонка/всякие службы из трех букв (тут я советую идти официальными-дорогими путями, о чем будет пара слов ниже) и нет службы радиоконтроля, то вы вольны со своим личным ноутом делать все что угодно (в рамках допустимого :)), ну по-крайней мере, так это выглядит у нас. Возможность перетащить файлики в dev-среду худо-бедно есть, но мне очень не понравилось решение держать node_modules в кодовой базе и я засучил рукава (рукава я засучивал много раз и по поводу переезда с TFS на git, и по поводу локального nuget-репо, но это отдельные истории, тоже не лишенные драматизьму, но о них как-нибудь в следующий раз). Есть несколько довольно дорогих решений вопроса, вполне возможно, что я смог бы протолкнуть даже какой-нибудь Artifactory, но когда я представил сколько этой займет сил и самое главное, как долго это будет решаться, согласовываться и внедряться, было решено поступить дешево и сердито.
Дисклеймер: поскольку у меня была windows-среда, то и описываю я детально именно работу в виндовой консоли, однако по сути отличия будут только в конце, когда вы захотите окончательный результат поднять в виде сервиса/демона.
Не томи, задушевенник, как?
В действе участвуют:
- Компьютер с доступом к интернету — зовем его исходник
- Компьютер без доступа, в корпоративной сети — зовем его целевой машиной
На исходнике и на целевой машине должны быть node.js (проще всего, если одной или близких версий).
Создаем на исходнике папочку, где нибудь и зовем ее, например, verdaccio:
mkdir verdaccio
cd verdaccio
После локально ставим Verdaccio, это очень полезная штука, основанная на старом проекте sinopia. Подробнее прочитать можно тут: https://verdaccio.org/.
Если же коротко, то это прокси для npm, которая умеет кешировать. Для очень многих пользователей этого пакета, ключевой возможностью является способность приватно публиковаться, мой же случай несколько отличается я хотел закешировать все что мне нужно для работы и чуть больше, а потом перекинуть это вот все на целевую машину. Забегая вперед скажу, что все прошло довольно безболезненно, кроме переноса node-sass. Именно корежа ее тарболы я провел полтора дня (там есть нативная часть, которая подгружается с гитхаба в процессе установки или собирается gyp’ом, если вдруг не вышло подгрузить — вдумайтесь, собирается на каждой локальной разработческой машине, что совершенно некомильфо), но это пожалуй тоже другая история.
Тут все просто:
npm i verdaccio
Вообще в руководстве рекомендуют ставить глобально, но на самом деле это вовсе необязательно, более того, мы хотим локализовать все это безобразие в одной папке, чтобы потом ее с удобством копировать. Потому так…
Запустим пакет, он создаст хранилище и конфигурацию по-умолчанию:
.\node_modules\.bin\verdaccio.cmd
Тут как раз нам все и рассказали, где конфиг, на каком порту висим.
В принципе можно уже сходить по указанному адресу и увидеть, что-то вроде этого:
Теперь нам нужно сделать несколько вещей:
Очистить npm-cache (подробнее тут, если коротко то убить содержимое %AppData%/npm-cache)
Выполнить
npm set registry http://localhost:4873/
Скопировать config.yaml в нашу уютную папку verdaccio
Убедиться, что раздел uplinks этого файла выглядит так:
uplinks: npmjs: url: https://registry.npmjs.org/ cache: true
В конце конфига добавить :
listen: - 0.0.0.0:4873
Если этого не сделать, то вы не сможете достучаться позже на целевой машине к локальному адресу.
Собственно мы готовы, теперь все пакеты, что мы возьмем через npm install осядут в ./storage, что нам и нужно. Восстанавливаем целевой проект, ставим дополнительно:
npm i node-windows
Все, после этого берем папку и любым доступным вам способом отправляем на целевую машину (там нужны админские права, да). Можно уже там, можно сразу создать файлик в руте папки же installservice.js:
var Service = require('node-windows').Service;
var svc = new Service({
name: 'VerdaccioSvc',
description: 'Verdaccio - npm local repository',
script: ' <тут путь до папки>\\node_modules\\verdaccio\\bin\\verdaccio',
nodeOptions: []
});
svc.on('install', function() {svc.start();});
svc.install();
Запускаем :
node installservice.js
Наслаждаемся!
В целом довольно малой кровью удалось получить локальный репозиторий, билды билдятся, разработчики разрабатывают и все в этом мире на своих местах. И да, последующая синхронизация сводится к копированию содержимого ./storage.
Вот это все было записано отчасти в качестве памятки, отчасти, ради того, чтобы сберечь тебе хабраюзер время (задача вряд ли слишком часто решаемая), потому если каменный цветок не будет выходить — смело пиши, есть шанс, что я забыл описать какую-то деталь, а если и не забыл, вдруг, чем помогу…