Проблемы с размером пути, связанные с работой с node/npm на сервере сборки

У меня есть сервер сборки, который выполняет сборку и развертывание в нашей среде непрерывной интеграции (CI) и автоматически развертывается в средах разработки, промежуточной подготовки, эксплуатации — все через определения сборки TFS.

На сервере сборки мне нужно скомпилировать шаблоны Dust (перед этапом развертывания) с помощью утилиты (dustc), загруженной вместе с Dust. Локально, когда я запускаю в Visual Studio, Dust загружается при запуске Visual Studio (VS) в папку node_modules, однако эта папка обычно не проверяется (в противном случае многочисленные клиентские библиотеки с версиями быстро приводят к накладным расходам на управление)

Пыль скачивается через npm (у меня v3.5.2). Насколько я понимаю, стандартный способ загрузки модулей, использующих npm для загрузки, выглядит следующим образом:

  • локально (внутри VS) загрузите npm через NuGet, что приведет к созданию папки в корне проекта ("".bin"), содержащей npm.cmd, который включен в проект и зарегистрирован
  • затем на сервере сборки после загрузки артефактов решения/проекта загружаются пакеты NuGet (включая npm)
  • наконец, отправьте следующие команды (в этом случае у меня это есть в задаче после сборки VS, но пока это происходит после загрузки пакетов NuGet, все должно быть в порядке)

    cd "$(ProjectDir)"
    call "$(ProjectDir)\.bin\npm.cmd" install dustjs-linkedin --save-dev
    

Конечным результатом должно быть: Dust загружается в структуру проекта (в папку node_modules), после чего я могу выполнить команду для компиляции шаблонов Dust.

Однако проблема заключается в том, что когда npm загружается через NuGet, структура папок npm сильно вложена и, следовательно, выходит за пределы пути Windows в 260 символов (https://github.com/nodejs/node-v0.x-archive/issues/6960) - следовательно, сборка завершается ошибкой еще до того, как задание возможность запустить npm для загрузки Dust (примечание: я уменьшил длину папок TFS, однако npm оставляет очень мало места для любого разделения имен сборок, проектов и т. д. - например, .../packages/Npm.3.5.2 /node_modules/npm/node_modules/npm-install-checks/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/lib составляет около 170 символов)

Я прочитал Пути к файлам окон Node npm слишком долго устанавливать пакеты, которые предлагают использовать версию 3.x или использовать npm-flatten/dedupe — но у меня все еще есть проблемы — в основном потому, что это шаг NuGet, который терпит неудачу — прежде чем он сможет делать что-либо с npm

Решение может состоять в том, чтобы выбрать только те файлы, которые необходимы (например, из npm или, возможно, проще [но менее гибко] будут просто файлы Dust [dustc и т. д.]) и включить в систему управления версиями, а не включать npm в NuGet. Но это грязно - если файлы, которые я проверяю, обновляются (как это часто бывает), я должен убедиться, что все по-прежнему не повреждено и работает.

Есть ли более чистый способ?


person TerrorBight    schedule 31.12.2016    source источник
comment
Ваши проблемы больше связаны с npm или nuget, а не с TFS? Вы также столкнулись с проблемой длинного пути в процессе сборки TFS?   -  person PatrickLu-MSFT    schedule 02.01.2017


Ответы (2)


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

Например: вместо \xx\Build\Drop\ProjectName просто используйте \xx\Build\Drop (или \xx\Builds), поскольку имя проекта также содержится в имени сборки.

Для проблемы с длинным путем в TFS был связанный пользовательский голос, и теперь он завершен.

Исправлено ограничение длины имени файла в 260 символов

Мы убрали ограничение из BCL для основных функций работы с файлами (CRUD). Вы можете найти более подробную информацию здесь:

https://blogs.msdn.microsoft.com/dotnet/2016/08/02/announcing-net-framework-4-6-2/

Иммо Ландверт, руководитель программы .NET

person PatrickLu-MSFT    schedule 02.01.2017
comment
Хорошо, спасибо, Патрик - еще раз взгляну на структуру папок - как вы уже слышали раньше, это ошеломляет, что это все еще проблема с Windows - я уверен, что есть причины, но если стороннее программное обеспечение может решить, конечно, это можно интегрировать - это сэкономит повторные потери времени - person TerrorBight; 06.01.2017
comment
Я вернулся и усовершенствовал путь TFS, в том числе сократил имена папок TFS и имена заданий TFS. Я также воспользовался советом многих блогов (например, alistairbmackay.wordpress.com/2014/01/15/) — сгенерированный по умолчанию путь (рабочий каталог TFS) был изменен с $(SystemDrive)\Builds\$(BuildAgentId)\$(BuildDefinitionPath) на $(SystemDrive )\B\$(BuildAgentId)\$(BuildDefinitionID) - person TerrorBight; 30.01.2017
comment
Спасибо за ваш полезный обмен! - person PatrickLu-MSFT; 30.01.2017

Обратитесь к этим шагам и проверьте результат:

  1. Установите Node.js на сервер сборки.
  2. Добавьте файл конфигурации npm в свой проект (package.json) и зарегистрируйтесь.
  3. Откройте определение сборки
  4. Добавьте шаг npm введите здесь описание изображения
  5. Создание очереди
person starian chen-MSFT    schedule 03.01.2017
comment
Спасибо, Старейн, но у меня нет такого уровня доступа к серверу сборки - ИМХО, это правильно, иначе он расходится с архитектурой сервера сборки vanilla, где установлено ограниченное программное обеспечение, а управление версиями минимально. - person TerrorBight; 06.01.2017