Сокращение для "../../node_modules/.bin/"? - PullRequest
1 голос
/ 23 апреля 2020

В lerna monorepo я хочу:

  • Не иметь машинописный текст как зависимость dev для каждого пакета. Скорее, я бы установил его как dev devdency в проекте root.
  • В каждом пакете есть скрипт build.

Теперь - в соответствии с этой проблемой пакеты CLI (ie. Те, которые находятся в папке node_modules/.bin) не доступны для разрешения модулей, как обычные пакеты ,

То есть у меня не может быть сценария, который выглядит следующим образом:

"build": "tsc -v"

Поскольку двоичный файл tsc на самом деле ему недоступен.

Чтобы обойти это, я могу сделать относительную ссылку на файл, например:

"build" : "../../node_modules/.bin/tsc -v"

Это прекрасно работает, но немного неуклюже.

То, на что я надеялся в том, что у меня может быть команда, похожая на $(npm bin) или $(yarn bin), но та, которая ссылается на папку .bin проекта root, а не на текущий пакет.

1 Ответ

2 голосов
/ 01 мая 2020

Я думаю, что основная проблема c в том, что вам нужно ../../node_modules/.bin/ в вашей переменной $PATH, но точный каталог должен быть вычислен динамически.

На python земле вы можете выполнить скрипт .pythonstartup при source ./venv/bin/activate. Javascript, однако, не требует явного шага активации.

Если мы имеем дело с чистым CLI, то вы можете создать функцию bash для динамического поиска:

function set-project-path() {
  BASH_PATH=${BASH_PATH:-$PATH}  # only set variable if unset
  for DIR in . .. ../.. ../../.. ../../../.. ; do  # set to required lookup depth
    DIR=$DIR/node_modules/.bin
    if [[ -d $DIR ]]; then 
        PATH=`pwd $DIR`:$BASH_PATH;
        echo "set-project-path(): \$PATH += `pwd $DIR`";
        break; 
    fi;
  done;
}
function unset-project-path() {
  PATH="${BASH_PATH:-$PATH}"  # reset to $BASH_PATH if previously set 
}

Для этого потребуется активация вручную путем ручного запуска:

set-project-path

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

Теоретически этот скрипт можно запустить в .bashrc, но это предполагает, что bash запускается где-то внутри проекта дерево каталогов.

Если вы хотите по-настоящему поумнеть, вы можете попробовать внедрить этот скрипт в переменную $PS1, которая вызывается перед каждым рендерингом командной строки.

Другой подход будет просто вставьте символическую ссылку tsc или node_modules в каждый подкаталог пакета, что является еще одним способом сделать скрипт видимым внутри вашего $PATH, но без проблем с синхронизацией или файловым пространством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...