Nvm-windows: Поддержка .nvmrc

Созданный на 8 янв. 2016  ·  18Комментарии  ·  Источник: coreybutler/nvm-windows

Позволяет проекту указать версию, которая будет использоваться.
См. Использование nvm

или, возможно, проанализируйте доступную версию из пакетов package.json

enhancement request wontfix

Самый полезный комментарий

Поддержка .nvmrc - довольно важный аспект использования NVM с системой CI. Я не связываю предложение package.json, тем более что оно нарушает совместимость с nvm, но будет ли принят запрос на перенос с поддержкой .nvmrc?

Все 18 Комментарий

Я не думаю, что это тот маршрут, по которому я хочу идти. Основная причина в том, что для воссоздания / имитации двоичного файла узла потребуется очень уродливый взлом. Например, вызов node index.js означает, что взломанный / подделанный node.exe должен сначала проанализировать файл package.json (если он вообще существует), чтобы определить версию, а затем выполнить настоящий node.exe для соответствующей версии.

В некоторых других подобных проектах для этого пытались использовать файлы .bat . Такой подход хрупок и противоречит основной цели архитектуры .

Я также просто не думаю, что спрос на это широко распространен.

Поддержка .nvmrc - довольно важный аспект использования NVM с системой CI. Я не связываю предложение package.json, тем более что оно нарушает совместимость с nvm, но будет ли принят запрос на перенос с поддержкой .nvmrc?

@ gruber76 - Я, наверное, не приму пиара по этому

.nvmrc , package.json ... они оба требуют одного и того же мерзкого взлома.

@coreybutler Я не уверен, что понимаю ваше обоснование нежелания поддерживать это. Не могла бы эта функция просто откатиться к просмотру файла .nvmrc всякий раз, когда nvm вызывается без указания номера версии? Следовательно, о каких мерзких хаках вы говорите?

Гадкий прием: переписать символические ссылки для Windows.

NVM для Windows работает, изменяя цель символической ссылки на желаемый каталог установки физического узла. Это общесистемное изменение.

Допустим, вы запускаете сценарий, указав версию 0.12.0 в файле .nvmrc , а затем запускаете второй сценарий без .nvmrc . Символьная ссылка будет указывать на v0.12.0 (из первого экземпляра). Если второй сценарий требует чего-то еще (например, v4.2.6) без .nvmrc , он завершится ошибкой. Это приводит к нестабильности среды при использовании символических ссылок, потому что нет настоящей изоляции процесса.

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

Если люди действительно хотят использовать подход к каждому процессу / проекту, более подходящим решением является изоляция среды выполнения. Лично я для этого использую Docker.

Простите меня за мое невежество, здесь. Мой основной вариант использования - разработка узловых / веб-приложений с использованием bower / grunt / gulp и т. Д. С несколькими командами. Для меня крайне редко, когда у меня запускаются несколько версий с интервалом в пять минут друг от друга. Для этого варианта использования файл .nvmrc - это то, как мои команды определяют, что должен делать узел.

В описываемой вами ситуации (сценарий A по сравнению со сценарием B) мне трудно понять, что поддержка .nvmrc была бы более проблематичной, чем использование сценария A (или пользователя сценария A), вызывающего nvm для установки версии, а затем забывающего установить это перед запуском скрипта B. Но я предполагаю, что есть несколько распространенных случаев использования nvm, которые намного сложнее, чем у меня. Возможно, например, если мои серверы CI имели большую нагрузку.

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

set /p nodev=<.nvmrc
nvm install %nodev%
nvm use %nodev%

Почему бы не использовать команду nvm для установки необходимой версии в сценарии npm?

Стив Ли
Отправлено с моего мобильного устройства Пожалуйста, извините за опечатки
3 марта 2016 г., 16:50, «gruber76» [email protected] написал:

Простите меня за мое невежество, здесь. Мой основной вариант использования находится в стадии разработки
node / веб-приложения, использующие bower / grunt / gulp и т. д. с несколькими командами. Для
мне крайне редко, когда у меня будет несколько версий, работающих в
пять минут друг друга. Для этого варианта использования файл .nvmrc - это то, как мой
команды указывают, что узел должен делать.

Мне сложно понять описанную вами ситуацию (сценарий A против
скрипт B), что поддержка .nvmrc будет труднее, чем наличие
сценарий A (или пользователь сценария A) вызывает nvm для установки версии, а затем
забывая установить его перед запуском скрипта B. Но я предполагаю, что есть
некоторые распространенные варианты использования nvm, которые намного сложнее, чем у меня.
Возможно, например, если мои серверы CI имели большую нагрузку.

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

установить / p nodev = <. nvmrc
nvm install% nodev%
nvm использует% nodev%

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/coreybutler/nvm-windows/issues/128#issuecomment -191852401
.

Поддержка файла .nvmrc была бы действительно полезной. У нас много проектов, и не все они используют одну и ту же версию node. Файл .nvmrc находится в корне каждого репо, чтобы гарантировать, что для данного проекта используется правильная версия узла.

В качестве примечания: также раздражает то, что за nvm install должно следовать nvm use . Мне любопытно узнать, почему требуется второй шаг после установки. Я вижу, что установка и использование - это разные вещи, но мне интересно, есть ли когда-нибудь вариант использования, когда кто-то будет загружать и устанавливать, но не использовать.

Наш обходной путь заключается в том, что у нас есть файл с именем install-node.js который находится в корне каждого проекта. Всякий раз, когда мы переключаемся на проект, мы запускаем node install-node из командной строки. Содержимое файла install-node.js выглядит следующим образом:

var childProcess = require('child_process')
var fs = require('fs')

var nodeVersion = fs.readFileSync('.nvmrc', 'utf8').trim()

var command = "nvm install " + nodeVersion + " && nvm use " + nodeVersion
console.log('executing command: ' + command)
childProcess.exec(command, function(error, stdout, stderr) {
  if (stdout) console.log(stdout.toString())
  if (stderr) console.error(stderr.toString())
  if (error) console.error(error)
})

@ josh-egan-ps - Разделение между install и use основном предназначалось для массовой конфигурации среды. Я часто устанавливаю несколько версий узла, прежде чем переключаться между ними. Тем не мение; кажется вполне разумным иметь флаг, например nvm install -u 5.9.1 для установки и автоматического использования ... или автоматически использовать версию и иметь флаг для _не_ использования. Я обязательно подумаю о добавлении этого.

Для всех - если вам действительно нужно переключаться на отдельный проект, подумайте о том, чтобы добавить nvm use x.x.x && node index.js в раздел сценария запуска npm вашего package.json. Распространенная передовая практика - всегда использовать npm start для запуска приложения узла.

Для всех - если вам действительно нужно переключаться для каждого проекта, подумайте о том, чтобы поместить nvm use xxx && node index.js в раздел сценария запуска npm вашего package.json. Распространенная передовая практика - всегда использовать npm start для запуска приложения узла.

На самом деле это может быть слишком поздно для любых сценариев npm _build_, используемых во время установки, которые зависят от версии node / npm. Или другие инструменты, такие как grunt и т. Д., Работают явно. Они могут выйти из строя во время установки с неправильной версией node / npm. или используйте неправильную версию, вызывающую другие проблемы, кстати, я предполагаю, что другая передовая практика - установить _everything_ локально (т.е. не -g), поэтому зависимости версий никогда не будут проблемой.

Таким образом, рекомендуется использовать npm install для настройки всего. Затем вы можете добавить этап предварительной установки, чтобы использовать nvm use. например добавить

    "preinstall": "nvm use x.x.x",

Это должно быть нормально, даже если исходная версия npm будет работать в родительском процессе. На этапе установки будет запущена новая оболочка, поэтому все действия должны выбрать новый узел и npm.

Возможно, вы даже захотите добавить предварительный этап, чем установка.

@SteveALee - да, ты прав, мое предыдущее предложение не сработало. Было бы слишком поздно для надежного запуска.

@coreybutler В конце концов я пошел на это

"preinstall":"nvm use 4.4.1 || echo nvm not found: check node version && pause",

Возможно, nvm use -i x.x.x вариант

Я предлагаю реализовать хотя бы часть этого:

В Linux / Mac в папке с файлом .nvmrc я могу запустить nvm use без указания конкретной версии, и установленная версия, которая соответствует содержимому .nvmrc получит активирован. Если в файле написано 8 , то будет установлена ​​последняя установленная версия Node 8.

Я комбинирую это в своих системах со сценарием, который перегружает cd так что я могу cd в каталог и активировать нужную версию узла, с этим сценарием в .bashrc :

# Support .nvmrc
load-nvmrc() {
  if [[ -f .nvmrc && -r .nvmrc ]]; then
    nvm use
  elif [[ $(nvm version) != $(nvm version default)  ]]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
# Override `cd` to auto-load correct version of Node on enterting directory.
cd() { builtin cd "$@"; 'load-nvmrc'; }

Это могло бы легко работать и в Windows, если бы nvm уважал эти файлы.

.Nvmrc не будет реализован по умолчанию. Тем не мение; в дорожной карте есть план поддержки хуков (https://github.com/coreybutler/nvm-windows/issues/190). Сценарий pre-use может использоваться для корректировки версии в соответствии с любым файлом, который они хотят (включая package.json, .nvmrc или что-нибудь еще по вашему выбору).

Поскольку эта проблема кажется почти устраненной, у меня есть обходной сценарий Powershell, который должен имитировать функциональность «nvm use» и «nvm install», если файл .nvmrc содержит версию узла с однозначным числом.

nvm install (Get-Content .nvmrc) будет работать нормально, однако nvm use (Get-Content .nvmrc) не будет работать (потому что, когда для установки передается однозначная версия, она устанавливает самую последнюю версию этой версии узла, но nvm use с одна цифра добавляет к нему «.0.0» вместо самого последнего.

@coreybutler Если вы install , это исправление станет ненужным (т.е.):
if len(version) == 1 { version = findLatestSubVersion(version) } else { version = cleanVersion(version) }

Следующий скрипт будет использовать «nvm list available» и отфильтровать список для наивысшей версии LTS, которая соответствует версии файла .nvmrc, а затем «nvm использует» его. Если он не установлен, то это «nvm install», затем «nvm use».
((nvm use (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc)) + '.*'})[0].split('|')[2].trim()) -like '*not installed*') -and (nvm install (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc) + '.*') })[0].split('|')[2]) -and (nvm use (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc) + '.*') })[0].split('|')[2].trim())

Просто хочу запросить поддержку использования nvm для чтения из файла .nvmrc. Это действительно сделало бы мой опыт разработки узлов между Mac и Windows безупречным.

Это закрыто, потому что это было исправлено или не будет изменено?

Есть ли другая Windows-совместимая версия nvm которая использует тот же API, что и версии * nix?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

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

t0lkman picture t0lkman  ·  127Комментарии

emartinpi picture emartinpi  ·  71Комментарии

vincentlws picture vincentlws  ·  18Комментарии

dcoferraz picture dcoferraz  ·  47Комментарии

megant picture megant  ·  57Комментарии