如题:在项目中的node_modules文件夹下有个.bin目录。目前知道的是是一些指令。
拿 eslint 为例。有三个文件:分别是
eslint
#!/bin/sh basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") case `uname` in *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; esac if [ -x "$basedir/node" ]; then "$basedir/node" "$basedir/../eslint/bin/eslint.js" "$@" ret=$? else node "$basedir/../eslint/bin/eslint.js" "$@" ret=$? fi exit $ret
eslint.cmd
@ECHO off SETLOCAL CALL :find_dp0 IF EXIST "%dp0%\node.exe" ( SET "_prog=%dp0%\node.exe" ) ELSE ( SET "_prog=node" SET PATHEXT=%PATHEXT:;.JS;=;% ) "%_prog%" "%dp0%\..\eslint\bin\eslint.js" %* ENDLOCAL EXIT /b %errorlevel% :find_dp0 SET dp0=%~dp0 EXIT /b
eslint.ps1
#!/usr/bin/env pwsh $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent $exe="" if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { # Fix case when both the Windows and Linux builds of Node # are installed in the same directory $exe=".exe" } $ret=0 if (Test-Path "$basedir/node$exe") { & "$basedir/node$exe" "$basedir/../eslint/bin/eslint.js" $args $ret=$LASTEXITCODE } else { & "node$exe" "$basedir/../eslint/bin/eslint.js" $args $ret=$LASTEXITCODE } exit $ret
所以,为什么会有这三个文件?这三个文件都是啥语言?具体意义是?package.json的scripts执行时是怎么样的机制?
有介绍文章推荐看看吗?
谢谢。
二进制可执行文件。
你贴的三个分别是 Shell 脚本、CMD 脚本、PowerShell 脚本。
从代码上不难看出,脚本最后运行了
node $DIR$/node_modules/eslint/bin/eslint.js
($DIR$ 是你项目的实际路径)。核心就是拼接实际的路径,以及判断是不是 Windows 环境、来决定运行node
还是node.exe
。