2016-01-08 4 views
4

Я работаю в веб-приложении (JavaScript/C#, версия контролируется TFS), и наша команда хочет начать использовать Visual Studio 2015. Microsoft заставляет разработчиков использовать существующие популярные инструменты, такие как Gulp для автоматизированных задач, поэтому я написал несколько задач Gulp, которые будут выполняться на сервере.Использование gulp для сборки без npm install

Моя проблема заключается в том, что наши автоматические сборки генерируют новые папки проекта на сервере сборки, поэтому я не могу запустить gulp myBuildTask без первого запуска npm install. Установка npm добавляет более 2 минут к процессу сборки, и кажется очень неэффективным загружать одинаковые зависимости для каждой сборки (поскольку они будут редко меняться).

В любом случае я могу запустить задачу Gulp в новой папке проекта без первого запуска npm install?

Опции Я рассмотрел:

  1. Включите node_modules в TFS. Я не мог добавить папку node_modules в TFS (что вызовет ее существование в каждой новой папке сборки), поскольку вложенные зависимости bower имеют слишком длинные пути к Windows. Я мог бы пройти этот маршрут без беседы, но я не уверен, что хочу, чтобы все эти файлы были в моем решении (большая часть из которых не нужна, например, файлы readme и test).

  2. Runnpm installпосле каждой автоматизированной сборки. Как уже упоминалось, я не хочу этого делать, потому что он добавляет несколько минут к процессу сборки.

  3. Установите модули NPM по всему миру. Я не уверен, что это возможно, но мне интересно, могу ли я устанавливать все зависимости проекта на глобальном уровне на сервере сборки (избегая необходимости устанавливать на уровне проекта). Моя озабоченность подобным подходом заключается в том, что я не хочу, чтобы вручную обновлять глобально установленные модули NPM сервера сборки каждый раз, когда мы добавляем плагин gulp.

В идеале решение будет чем-то вроде # 3. Модули будут устанавливаться глобально, но каждая сборка может запускать npm install, которая будет проверять каждый модуль. Если новый модуль npm был добавлен в package.json, он будет загружен. Этот npm install будет довольно быстрым, поскольку в большинстве случаев все модули уже существуют (глобально установлены на сервере сборки).

ответ

2

Есть несколько вещей, которые вы можете сделать:

  • сделать npm install работать быстрее. Для этой цели используйте новейшие npm (если возможно) или используйте npm dedupe. Запуск dedupe может привести к меньшему количеству зависимостей, чем к обычным npm install. Затем запустите npm shrinkwrap, который создает файл npm-shrinkwrap.json, который содержит «замороженную» информацию о том, что точно устанавливается (и в какой версии) в течение npm install.

  • Помните, node_modules это просто каталог, если вы можете скопировать/Rsync его к установке, вы можете пропустить npm install фазы вообще

  • пакетного Node подхода является первым попробовать каталог местных node_modules и если не успешно (node_modules не существует или отсутствует в node_modules), проверьте node_modules родительского каталога, затем каталог grandparent и т. д. Это означает, что вы не должны установить пакеты глобально, полуглобальная установку вполне достаточно

:

my_project 
    node_modules/ 
     dependency1 
     dependency2 
    build_001/ 
    build_002/ 
    build_00x/ 
     no node_modules here, 
     no deps here 

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

my_project 
    ver_af729b 
     node_modules 
     build_001 
     build_002 
    ver_82b5f3 
     node_modules 
     build_003 
     build_004 

af729b и 82b5f3 бытия (префиксы) Ша хэши файла npm-shrinkwrap.json. Если вы затем добавите новую зависимость, файл shrinkwrap будет обновлен, скрипт сборки создаст новый каталог ver_something и выполнит в нем npm install. Выполнение всего этого, естественно, потребует дополнительной работы, но оно должно отлично работать.

------------------ РЕДАКТИРОВАТЬ -------------------

Если вы не пытаясь избежать npm install (вы просто хотите, чтобы это было быстро), вы можете придерживаться типичного сценария: вы проверяете источники всегда в одном каталоге и даете npm install использовать старый node_modules как можно больше.

Если вы хотите всегда создавать новый каталог для сборки, вы все равно можете создать node_modules символическую ссылку на старую версию node_modules - и в этом случае, НПЙ будут повторно использовать как можно больше из папки символической ссылки.

+0

Отличное предложение с использованием родительского каталога, я не понимал, как работает npm. Структура папок 'my_project/node_modules' и' my_project/builds' должна хорошо работать. Затем я мог запускать 'npm install' с каждой сборкой, и это было бы быстро, поскольку все уже было бы установлено (кроме случаев, когда новые модули добавляются разработчиками). Я дам ему снимок в понедельник и обновить его (и принять ответ). – fotijr

+0

Ждать, это не так просто. Если вы запустите 'npm install', он игнорирует тот факт, что существует каталог' ../ node_modules' и просто запускается полностью, создавая 'node_modules' в том же каталоге, где присутствует' package.json'. Однако вы могли бы сделать еще одну вещь: символически привязать родительский узел node_modules к нужному месту, а затем запустить «npm install». Я пробовал это, и это работает как шарм. Я отредактирую ответ и упомянул об этой возможности. –

+0

Итак, вы попробовали это/это сработало для вас? Если да, не могли бы вы принять ответ? Благодарю. –

Смежные вопросы