Хороший способ установить точную зависимость глобально - PullRequest
1 голос
/ 10 апреля 2019

В мире Node.js мы можем использовать NVM для переключения между версиями Node.js, а также для переключения глобальных пакетов (в $ PATH).

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

Я думаю что-то вроде этого:

package="typescript@3.3.334"
dir="$HOME/.temp/$package";

if [ ! -d "$dir" ]; then
    mkdir -p "$dir"
    (cd "$dir" && npm i "$package")
fi

export PATH="$dir/node_modules/.bin:$PATH"

do_the_original_thing_you_wanted_to_do foo bar

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Учитывая, что npm поставляется с npx, вы можете просто запустить TypeScript с npx и указать желаемый номер версии, например:

$ npx typescript@3.3.334

Это загрузит пакет typescript в нужной версии и запустит его (а затем выбросит). Единственным недостатком этого является то, что пакет будет переустанавливаться снова и снова, каждый раз, когда вы запускаете npx.

Вы можете обойти эту проблему, установив typescript локально: если он уже установлен локально, эта локальная копия используется, что ускоряет работу, но, вообще говоря, это самый простой способ убедиться, что при каждом отдельном вызове вы получите версию, которую вы ожидаете (в отличие от глобальной установки через npm -g typescript@3.3.334, которая может быть перезаписана кем-то другим, даже если вы этого не заметите.

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

0 голосов
/ 11 апреля 2019

Я, вероятно, в конечном итоге напишу какой-нибудь сценарий оболочки или функцию bash для простого переключения версий глобальных инструментов cli, это работает:

#!/usr/bin/env bash

package="typescript"
version="3.4.1"

dir="$HOME/.npz_temp/$package/$version";

json='{"name":"foo"}'

if [[ ! -f "$dir/success.json" ]]; then

    mkdir -p "$dir"
    (
        cd "$dir" &&
        echo "$json" > "$dir/package.json" &&
        npm install "$package@$version" &&
        echo 'npm install success' > "$dir/success.json"
    )

fi

export PATH="$dir/node_modules/.bin:$PATH"

tsc --version

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

...