[Из песочницы] Локальный (offline) npm репозиторий

39e0idv0ornzrz6n09uxnwpvf3m.png


Предыстория

Решив продаться задорого, я оказался у работодателя, где интернета нет не только в пром-контуре, но и в деве (ситуация на самом деле нередкая во многих, так сказать, «энтерпрайзах»). Есть 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

qgpew2ztbix-dqcfmdgb7t0rcq8.png

Тут как раз нам все и рассказали, где конфиг, на каком порту висим.

В принципе можно уже сходить по указанному адресу и увидеть, что-то вроде этого:

7l-gcmf6yzdnr9lxfmkksuxckla.png

Теперь нам нужно сделать несколько вещей:


  • Очистить 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.

Вот это все было записано отчасти в качестве памятки, отчасти, ради того, чтобы сберечь тебе хабраюзер время (задача вряд ли слишком часто решаемая), потому если каменный цветок не будет выходить — смело пиши, есть шанс, что я забыл описать какую-то деталь, а если и не забыл, вдруг, чем помогу…

© Habrahabr.ru