簡體   English   中英

如何使用 npm 腳本獲取 shell 腳本?

[英]How to source shell script with npm scripts?

我的package.json有一個腳本:

{
  "scripts": {
    "start": "source run-nvm.sh && ..."
  }
}

但是運行source run-nvm.sh && ...yarn start (或npm run start )不同。

為什么? 它創建了一個子shell。 所以我不能改變原始shell的環境,我不能為它export常量或操縱nvm的狀態(我不能改變父shell的節點版本)

所以真正的問題

我可以通過不創建子shell來執行yarn/npm腳本嗎? (並使用當前的外殼)

或者

如何使用 npm 腳本獲取 shell 腳本?

最終,您可能會通過詢問以下問題來嘗試改變話語:“為什么不直接source run-nvm.sh && yarn start ”但我不想只添加一些自定義腳本和復雜性,我希望它是自動的在yarn start / npm start上執行(自動更改節點版本)

真正的問題

它當前有效(腳本更改節點的版本並運行應用程序)但由於它是一個子shell,它不保存 nvm 的狀態。 所以在每次yarn start它最初使用默認版本,然后更改版本,然后啟動應用程序,因此它為版本更改的yarn start命令增加了約 3-4 秒。 雖然它不應該每次都設置版本,但應該只設置一次,第一次。

完全猜測,但嘗試

{
 "scripts": {
    "start": "bash -c 'source run-nvm.sh && ...'"
  }
}

我今天遇到了這個問題,我找到了一個對我有用的簡單解決方案。

  1. 使用 vars 創建一個 env 文件

    # cat > .env << EOF PORT=8080 DB_HOST=my-db.host DB_PORT=3306 DB_USER=mysql DB_PASS=123456 EOF
  2. package.json文件上創建一個新條目

    { [...] "start": "export $(cat .env | egrep -v '#|^$' | xargs) && node production-server/server.js", [...] }
  3. 像往常一樣啟動應用程序

    # npm run start > myapp@1.0.2 start /usr/local/myapp > export $(cat .env | egrep -v '#|^$' | xargs) && node production-server/server.js > Ready on http://localhost:8080

就這樣。

如果您想知道export $(cat .env | egrep -v '#|^$' | xargs)作用,請繼續閱讀。

export $(cat .env | egrep -v '#|^$' | xargs)
   |      |           |                 |
   |      |           |                 transform the output in "PORT=8080 DB_HOST=my-db.host DB_PORT=3306 DB_USER=mysql DB_PASS=123456"
   |      |           |
   |      |           filter lines starting with comment or blank line
   |      |
   |      cat the .env file
   |
   save the env on subshell before start the node

發現了您關於使用 vscode 插件的評論 如果您只想在其中一個項目的版本不同時更改所有終端的 nvm 版本,請查看我的矯枉過正的答案。

我可能會將所有邏輯放在一個 bash 腳本中,然后只分享鏈接。 👍

通常 node 版本存儲在 package.json 中,導致 node 或 npm 版本不正確導致失敗。

// package.json

 "engines": {
    "node": ">=10.0.0"
  },
  "scripts": {

通常版本邏輯位於 $HOME/.bashrc 文件中由 shell 提供的 bashrc 中。 創建新窗口時,它們會重新觸發 nvm 使用。

兩種可能:
都使用腳本: script-to-replace-nvm-version.sh
# Which replaces in bashrc the "nvm use " line with "nvm use $correctProjectVersion"

  1. 使用 json 包中的啟動腳本運行 script-to-replace-nvm-version

  2. 使用 PROMPT_COMMAND 運行 script-to-replace-nvm-version:

這里使用了一個檢查來確保我們在一個 npm 項目中。

小心 PROMPT_COMMAND 因為它每次都會在 ps1 渲染之前運行。

 PROMPT_COMMAND="[ -f ./package.json ] && $HOME/.scriptsourcedbybashrc.sh"

腳本摘要:Nvm 通常來自 $HOME/.bashrc 中的特定版本。 因此,我們可以在 npm 包中重寫包含 nvm use ... 的行並更新版本。 我們甚至可以提示用戶您要更新嗎?

從 package.json 檢查節點版本

projectVersion=$(cat ./package.json | grep 'node":' | tr -dc '0-9.')
echo $projectVersion

從 $HOME/.bashrc 檢查節點版本

nodeVersion=$(cat $HOME/.bashrc | grep 'nvm use' | tr -dc '0-9.')
echo $nodeVersion

檢查 node 和 package.json 版本是否不同

# bash script, to be sourced by npm run start;

# WIP, needs a few more error checks
# such as, nvm used in more than one place in your bashrc.
if
  versions_differ_tell_and_prompt
fi
versions_differ_tell_and_prompt() {
  echo "nvm versions differ: ";
  found in project: $projectVersion;
  found in '$HOME/.bashrc': $nodeVersion;
  echo ;
  echo "ignore with any keypress or [uU] to update";
  old_stty_cfg=$(stty -g);
  stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg;
}
if echo "$answer" | grep -iq "^u" ;then
    update_file 'nvm use' "nvm use $projectVersion" && source $HOME.bashrc;
else
    echo "No changes made";
fi
update_file() {
  searchLine=$1
  replacementLine=$2
  lineNumber=$(cat $HOME/.bashrc | grep -n $searchLine | cut -f1 -d:)
  cp "$HOME/.bashrc" "$HOME/.bashrc.backup"
  sed -i "$lineNumbers/.*/$replacementLine/" "$HOME/.bashrc"
  source "$HOME/.bashrc"
}
unset searchLine
unset replacementLine
unset answer
unset old_stty_cfg
unset nodeVersion
unset projectVersion

其他一些有用的鏈接: https : //github.com/md-command-line/ERRORSCREAM/issues/2

從這里獲取大部分邏輯: https : //github.com/MichaelDimmitt/git_check_computer/blob/master/git_check_computer.sh

根據找到的鎖文件更正 yarn start 命令以運行正確的 yarn 或 npm。 https://github.com/MichaelDimmitt/know-your-package-manager

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM