脚本

npm 如何处理 "scripts" 字段

描述

您的 package.json 文件的 "scripts" 属性支持许多内置脚本及其预设的生命周期事件以及任意脚本。这些都可以通过运行 npm run-script <stage> 或简称 npm run <stage> 来执行。Pre 和 post 具有匹配名称的命令也将针对这些命令运行(例如 premyscriptmyscriptpostmyscript)。来自依赖项的脚本可以使用 npm explore <pkg> -- npm run <stage> 运行。

前后脚本

要为 package.json"scripts" 部分中定义的任何脚本创建 "pre" 或 "post" 脚本,只需创建另一个具有匹配名称的脚本并将 "pre" 或 "post" 添加到它们的开头。

{
  "scripts": {
    "precompress": "{{ executes BEFORE the `compress` script }}",
    "compress": "{{ run command to compress files }}",
    "postcompress": "{{ executes AFTER `compress` script }}"
  }
}

生命周期脚本

有一些特殊的生命周期脚本只在某些情况下发生。这些脚本发生在 "pre" 和 "post" 脚本之外。

  • prepareprepublishprepublishOnlyprepackpostpack

ivkm3VUaSYc3NzApouoegESnYSSGFseyVcjNFn2fzk00qZ4BvGbIEPz76WZD6Sa72rcUfJEdSs118OQFs7TNXQ==

    naq7tcFNPtsiKOgxYKC27X6H3auwZywFjubgYJnxCkWdhksFM+GBhCUeRvAz7zR6TKY4JNAisLTrm5IgntpRz9UHQBzl9CGGQSKYnI/d5vhs3XG2TLQHOFAAlJ6em4b75KAcqN/obF+ZGwlm8xyfw7O3e3wrBWuFi2YUYWMUlfGaXhyyGeyt1eLCv4cMcMaXUxNrJd7y103dtpiAiknBQtvwXIxOG+0Pky7mfx7STKyEqIG4a67DEKl9Lx7qHpQGnhwBfNFuFNaOm4qR4X77OcF7OOGWxwtabA1hdU03kIh0jb/tL+sO9w1IMDRxfORAiNgo1UR/wIhF72YID+CubZFqXgMaLkHQSVF4m3/caBpv20hW4o0DXcR8ZzI0t97MZakhQnLO/4C3xDUKM3R35hDmIoCahXaK0B1/1JYnY0To5KT2LVai1yUgVAA8qunM1gwe2DaAY07To+RzHvxf5SVtxPNuHLo+8k86MLhCgKG/EmJRJJhmkaJJxwe6eA8HlFWQ9RZ5HZ7OPGMka3kAj2sqUyrqxPhyscxzo3f2xOVGRwW41C2+LP99TKZsMLB23WCtmAcjT82ljI8SVLdk0JW+Ch7RNbCTkzcBdx2nLMg=

QC9GUPAY4IEyIA4RlGEAjj5uWWUbiTwOPX3ZK8u14j0QyzPLYl63RMZ4f6RmXHB9

    NYSSifaVr7bWYOQF84e4kdxx80iD35+yL1TmtRTZLEy+qAbZg4bFmSHqQ3BCGGSH

QC9GUPAY4IEyIA4RlGEAjtEag0LCpeIw5T0sLOOrr/g=

    VDcubOhI7uJffjlK9+ndhHfrLmIcXLp8P2j/KyPCWEHT7ENJO+UelTqW7n5bBwVSMtNF9ZfPVr3tR9kVW68hcX8BhThGhCmQ6JjY05pNtwwsOrF1rmV0Gwlcc692MkpI

hUuCwPDK28jNI7FmaL7PR+ReL1icJCbZ9497GMsVNmI=

    t4371v1s/V2KQC3LpJwCQtVMBBH9hDJAQMCbVxrPogTaYQq/9GZVL0vQalNpPUIyG2+/WkBqmg+P0KPl7wT9at0OijxKjUQb0rQG+gCRR5RqonAXpfhY+CFATDIBJzuYRhXDr9r16/SOdRv56TmKTIWRGG/nt2LFg7YyULxkGm6eBNj1lqjSFlayC+vxNETXxpevxjMsTHD5S/KpFo2O4+QJa928zIYdwSegzRB9Ose9Kuote8YhEtBc1NQ1Ti/NIGzKee2y3LJBQAKMPLTfDpLOog2/Z8pGv+7yfu6LAxXpujv1Zt0UIin35oF6yfE4AEK9iMy7dg1RpSC14S2EmFJ6JS2QgwRoBb5Jd2n4xl0fW7xCxXyL6GzrUCGkCuQ540Nc59/LwBFDZ0NRYXWLZqV4bhOrQwDT9KpR68BN5sgVYOYhVp1R2t8jhOS69j3RMTROj3PLsVsK2bO53gONrg==

IETOSmftY64YHt3YxPxiY0Cb8Xw487tWa178x7130dU=

    LV0hnN2E3Oxi93H/7Uo0RhYAhvz5pQ3pQWrE7vRZpu8ydodgBTm4G7iYA5GRU6Orvsc9jkhUFjEP8wwtxKwdi3Bd+biUzJ4od1WJ/6Joi3U=

准备和预发布

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

生命周期操作顺序

npm publish

    iXwN2Ae9q2w++JCCEcqtwZTrL2KO+WFxAQRGrAChfdPGNSpJ11c31KyJXYuGTFk6fK1LCRGebscKYYn0dZKi2qwTP15kX22QMfc8G8EFFEkn1S+G/HnVecL0TGcBtKJleTflaOmx/nz3iohpGtwicfBz4cBJC+sa1d5GScpW8aSMgYDwuZiqoMWEBuBS0Y/1gu7d66PJxYZpbjQOjtyYSInqKBGHR7S+Sl78nNQHUY0=

npm pack

    4azOc3ouPXqdtv3YXACQD9oNpNRNslBzII+NNwy7qNrPDoij1rwgtpxL48e7ezTT02+F1knqP5I+GtyXtl2kmw==

npm install

    9VPXF4ZvJ5MLvqlZPcan1GVECnM8QOhcqHucf0s0+ekWlj197BDpFKVNDQPKZQXyAMKqmIMkvPEcLLJjh1tsMYr6tqKon0iOixDzwBwNmvtpnFLFivXXlQGqMWDZdqgzb1zYnKfM38CfrF39ZklVAA==

RDvMgUD10rUA93V9B6tKDg==

    iXwN2Ae9q2w++JCCEcqtwam3W3rIWFUmWHhS+O4WJDmc5UlX0Y+XAkn86mLEpQrZ891xvcOr/KVQKeOrsxoNQHWQKfiY4zttKq9zmg0o5ZbwEQWtkcIrOEE9Pjfg88V7

npm start

4xwyRJtDxBqmkK54Hr29jx8//Vx/jhuUPBslme53thivEunN1IguX8JLAIcDWz3yPKB8Wldofj4Muy44nZigxEAUpf53unC9chI9R5OgfYk=

    z/JmC9WeKv48BE6EKHO0oVItvzRe9dEJROVXANMTi4UkbsqCNVDQBBh4Md1b+y8b+lYtbp6Uta2B2h0Rfzql4hTZXmC+nNIc8CoFoXqmhFF7WXIw6gnQ6E2QEeBgWTwp

默认值

7TkdeI3BSqNCdyF6kzKVC3vfChnnL8pGk9mzlDW+kT+lkNxXrWZfnbWss9tEu12W

    BNwne5fGoQ8KFWUcWBnlPgteqJeUxsMjZxr4ELecSaKJZITqX+OaGVRDTCRCl6Bfz4QyhGdpJlZrz/TdgEx0wMX2RCncRT6t1HNaWl0WKhW0WP3PD7f9dBPfy6bbf/1/KZx0leqMgVB2E3J50uJlgshZi1nh4Aa8B8xWI3mwA1zLfkeNvSHDTUJXdfaZbAyTMgo3gvNSSc/aIRjxQZnUY3BLmxrE/gwC9qYLV7MCbWYANo0MAG/DrsGyjNlwLpH3wxCgEddOKiuFm5CvXdeVXoXNSGHNBKIPLxpiQXt76dOKaLHKb6vjIniMLM/rAWSNmKJciaP+4qKAB6pNU1EXZRHjIfngfav5agZ0gBJa7EYYs+NHkJiovUm9B1gyg5A5rS4mVWJatJOpGq0ISRCQaGxyRKonpmW+jgoo9hI727twa4zTlQ4wj2c7lnIMatBs4xN6FFmDHOafKCsx/PVcJ9AnNSmLMVf29YuhfY9Hlo05SAdno2+xDB5rgcu2nL8xlhXDMjOGwID5XUYRFwtvX6zwiFhJZ6+rtua0Lu7/8igyjoK221RP4EoLNWwy6CfMKjX4KX9Zl5u7eHPiA4rkNd0ONpKZ7dL9YrMSaNR5tfsuX4Fh6WfO8zgDaarjNDdjLe1bfS4LXkUPnJVDUNDCKVEFi5ADi8fqvOdQrGT3sDo=

用户

gEgeL07mhuKzEUHQFmp6EyLAtUG4WZmayJjUeyGaXG78FH05GtfJb+4ucEqj/DMpgqpvZ83fRMtyGmruRK3QJ5hSXY+4czMlI4Ph2Xgq7uWHXXOlnLAT4ZOXzaihbZM2eLNbHqyqAMMzA3ak4bL8dWtFa6e8ryYY4aYAZ2+VxL6il0lewI5GMVv8V2xd7D8zGuJx6CdeTB0NZrEUuy7CW2wqXJk4RUBj8SmDfSzuUxP1jqmXiN+I+cW13BuqPvXLOR+U62wbtetGE7Q6A2CCVdrBTxIUCbaGFzKwbVTnCrHo9VpS//Z4E4PGyIwu+bKF

环境

Kf63MZ5jI2LTloBxZ1+qFPIF1SQjEJcS30q+EyReJ0f/4mAGr/iJXBJ9cm7hl9UprN6v6Hhl8gXvLNPFroZ0UxL4sjqNA1q1u58owCqHnAK2swFWABNgg2UGUjCM/jhDsTqEV1ezuZBQQa6YKpO5AQ==

路径

2s/SEhsiWdJ1gN5MP68Yki1ayBAThbytY0/SPwcpKtUO6P9l4946l8QY32wtGW2wHSca8qW/SWy7+lalmbouGhuWgvm8CfLgG4I49BV3kbkcQZaYmDHtiIOLMdJ3JUGAXkiwQZ98J95PSqviBKYJ7hRgnMEK5UUNk63cZGkVQtbZH3iTCSb30eOu/A+0xg7GKt5qJdTEiAFytOlwXpIXDK/77V2n7BbG+eE1E1TtuK87M3HfcOSHoK0OQ+PwDwPGyidrsfpgIlXyELitMKuHiA==

{ 
  "name" : "foo", 
  "dependencies" : { 
    "bar" : "0.1.x" 
  }, 
  "scripts": { 
    "start" : "bar ./test" 
  } 
}

n5qJnmO2c4i1uGBwKThYAHYCFMpuB+sO7zdxAjUwrPO9OF77ocqRQX/jPKYMkg6S62Hvuh2Nn+VoQwCHWwD8EPQLN4Nkv8fdOoOv4oI6IeyxS4sBY0UY66WvCqtkHQ0BuKIYkhCZXJ7iW7Gp64l8A/kmOgkCp25z+9RpJul+ftc2a44UmmW69MmD/A3cYpVRlcUbv2sZgfu3hfKgNfODZWHHgb/IvcI3FREliH1J4HkAbO7qPSQgPwXzMWquoSCo

package.json 变量

89hERNmQ+XO7ficcAai/ytW+useAwKpPONCoEtoPe64quIcLpYQSYkjUhZGhsvKf+0vm5zFVUujJ4zzSg4QYOeQmcjdzSQACjVz8VsUYs0AkgsVyGyh1GpFraogmPA0fSIneR24kVoUY+WnaewkG9UXTPTl95kBOI0U3FmbZsfgUec28zdxEKQ61LTBkbpAyMlYMM5nyUc6O5qXR+zBafGxu4FYYVnJzWGTvugqwjHE3xqvKNFnF1Zc9U9kXhDZKzK+aWQumuWcRE6Sf3JTcEs2L14bFEoRZuyeTgXArk3ptyfDQemuTuf+4XgZjfjl8znQOZ/ypwAP+eNvSVCL5qjnDzXR1iKj47OOPxx7eSUkOxMj/N8b9U77/wViJntWq/ZH0iB9wfPWnaz8xzJQYXhS7Ltb0x/laQOY9UNIn9x41hOw0un6hevXzlNLO7Hw/AiVOLma+WL3oZ+83RmqA3oEWKcJIeXi4b4Tdh5JrwIj4S0pMhvxvpSZnjbp/B/rZ9dwWeGqv64keBfdNYfe1+eYo3qE1vKMvhf7xnqHER/B/sp5/nmCsHeXUiU6hCVPHt3Gvq4uXQA/psoliEpqt+aitrNvBbSvuDagYaXZ4CxvvjVB1VcvYI2g/vE0CmmV2siTjq+UQEgc0UmppdEncbw==

configuration

pwWWov+ZcBcPj4QdATn6bsqN4BMDDTWomDmE0rK9TgSjykNict1O6OwYn5bdJXmZjGzOEOMG7DAUVMtySOzqj6m4m/QR1zRhqzFMLe13PcaE3Pa2jzre5dSyxMtVGXXiJ+CJE95GjEXOVDpnDwHF3XB0VskfAK6epytr5DsVaH/hmnREJqedSAMbXUHnl4P6aQHPvxmyctZNzg7D4IC0hP93566O53J9c6GkAt5p6QyDxlMozvgD8zRvgbTU4tcE

特殊:package.json "config" 对象

RblbOSIQx8t3Mc7gnHyMV4eo3Kot3uVdo2y+q+xX0fnnGbOp3jHznWVBpX/jn8u2NCEP0EEu63lxHtI/32vj5In00SMUDFcTXwI+syJ1ADzWW8VDT9wI8VBVqvO/9pjT1gDob9Lo55Lj7kEmkgIwZAnU3FhsRe+glVPsGIUGFyP4SWiQ89s+9lmSSjtKaglQaPiStG9X4qF3Qdy1JwMOPTEi8IjB1uSKzFe+H1Jp4ZYy4AZOzt2OMSvsAtxhsnwK

{ 
  "name" : "foo", 
  "config" : { 
    "port" : "8080" 
  }, 
  "scripts" : { 
    "start" : "node server.js" 
  } 
}

Ng4vFQkZF9afyAaWsK8wloCZyZVGSRexTppyCTo11dQ=

http.createServer(...).listen(process.env.npm_package_config_port)

6Q4xgwRzvHaM+HbyEtJbgmQMRWezMAJwSbK8KDO8dIFqCNYTg55typKcGerpY9gvfOxGUy9SrVoeI/AuM/h4eA==

  npm config set foo:port 80

当前生命周期事件

SWCqoYwRg3Igz5yEBNWxXXIoT5LL8VF9CKj1WE+OX2n28ZLATUIzNLdssfvzTkbTesxCvG7mRnIaQj0GcouHJt0FkpivnxtAlUdqeMCDMyPqvMBZcrVWiw3UTWuk+ujmh1R5MZ0wb9Lh2SH0hZD7U5vXBrnfP49DXh3wNGh7oQFrtx7UDcAydvqTwkiyWbGfCKlJcamp3KjGFogeLr4PtIn0nwabIPmPpGaN4ylMrHrwdjs/CY64QdG9zZeD9TfQIXs/uWzVLjSpc9xPEFjfPrZOx3H4pzqregqTQv1HOm8=

EZocGxf64kLnNszk0n4714KaeVipatQk1gjp8JaPu3r/tX2e8ntZ5HOSAPr/WfvWFvakWCvkAJcicGzgnVaE+bw97Nc1gKtBcEeRfkNoS/dq2yf61t738cK+o3U3PsQFmApdxGrOlWg3nHwHmv9GGsDCT68bX0fTNjhDz8ABzFHR1cdQYjc9NtZjTAlMtBgGF0Z5b+9j4sm4lkemDXpzRA==

process.env.npm_package_scripts_install === "foo.js"

示例

ootZrMJCHPKtA2pECGKVT1W1EG2ZsA8g2lTWEOy2L22ZRmi5p2QPLTc/1ZMFvuu/hOnxQbcr3+mYY6+R7fLdug==

{ 
  "scripts" : { 
    "install" : "scripts/install.js", 
    "postinstall" : "scripts/install.js", 
    "uninstall" : "scripts/uninstall.js"
  }
}

yrc+XDGjhB0V/AHE0NuhJm5tQYaXpec07chLi8Anm5AY0SQkfdwg2cpWG5z0sYMUjhGunvXjnJ3bP+kHxLkmDvm8RjsjeLAAcfluwMKeg+7KByWSr27P9ubBDMwjlTvQuOGt1TEAiRI9/Qn9rEKzogThQRW65k1Wg4ipPYEWA2gVId5zX0ml9r9OtG2vwTqZLvoH5QMGHQeMV0Y9P9ZHHQ7QEfPryAQMgIREyImQKCMVvXAz2iESkIKRUsxVAg3EuXCNV1+vMK1ntPwd07l87yDgR0sZFk80TvlB+tW1+PRE6shaSzTZ78PEZhNihGEF7aTK8DHwqtReb4KNGBQb44REJ8W3hrO7DZHtz3YatJXWtZTpir3L5pPobhNztd3JcZR9pZm3/aeOuE9T4gYlkNhLMkldUFqTz4DhkuScc835Umps4A+ePcrNjG174CfR

+KARx3b6iNCxg3jnp1DpzqK6tNSlNPDViipeTvVL260WwjM4kaInq49e14ZoffnAgdfj9jKncPo72s0dAGHIzC7ITC/6YCc/3md7lmDadOlRTf8827S8I2URfNDMNeZo

{ 
  "scripts" : { 
    "preinstall" : "./configure", 
    "install" : "make && make install", 
    "test" : "make test"
  }
}

退出

f7kyP2iJFJOU4BZgbkul/pJ4LXllDkBOD7esWOuVDE6gIF3cKSGQVTPZAwmq5OVQ9Cpr5cFMZ6cMC+/rw4+JOENuLe7KBoGZZ+bcEX6Q/fY=

vz/dCHVFEC46l6xvwhuRwD7AhHyIBEAHICF2nsBGAFpUKMFnET9zNCDHRVX9ODSn5PCEtqu337+tLHSNHpD6hv2HdbV0RuYi9+eBYRJ2sqg=

9lyucg6M7Q8JFwjY1cZTTXbfdr4e5RtbugSABp7C/fNt72cC7t+BBxT3xeFuOYMfah1qpv3aSMQla1tLOoFysQEudUd9IaZdVFw+q+lqEo54z5wrSZDkxdrXD2cSDFRyRmb8l9cr4491ZAfAnTTpTvjbSvCT8Sbb8IOpNSUJWJQ=

钩子脚本

re4EVHo08zwKBp4qKoTRfGhBY1ZHPvTtxvqvwgXr2IcWCeC965N1LF2BtAVqqpSVc1UzNbO/aW8bFjV2Prb+GRSiiCTzKsBJy3sAU5qDXCq9n5fuuQJorUZVXx1IqIu8YOm1y+94ka7MOGDPGTXCOQ==

Ds1d0W4ZD+R1vRdv6Z2ZPtxXoKOPoLfUgBH94g5g8O7cbmIpVUT82Zn84icbe76cjyYNVvrS4n7iUO3Cvq/lorwd+WQukyE+NVErpL49hN+VprsiCvBUq0ZuG4dqK3Ff30/cTB21wJi2dxtIiovNKPGRLPNpfdzwukoeabxlttvatZsjPmULNa7Kh6fS+r/cjF2HjeILW1KRq8YOQF9WFd0QcUeXJFAvMzL/jldYDn6Xk7byWHefpPgDrbeRydow6QrhBRvyOKgXKpe9PCUdpw==

qJOBLQJXq+TBreRP4kyf7P2pSw5D4IB74VEcWn3bAwzVknM9XxuYRBrd73B4WrKSpOI8acf+oCy194js938JyCgrm8tdZVbUPXaLdc5VqxKIARsO/qi/0+w3A67pbCpPemUkUFbtnLcF3F2kdnZbNmhJIYFkt0IJvJLUdAHJrI8hgoF+4zK6q0vTeziUgfsN

最佳实践

    5NbETeVAYnjP36lo4FeNWy9LwYC8N8VvlOJTnnix3HyEO9Y4A0SxD7KZPfMFQq1I7f2fZv88jedpqEzV8QIpIvchrWUPh8oD9RhBAifuOEyVpgG8sHFiISrl+RilVznx+dxfPXpl6uFTyW60+98LK2ReRshsTdfecvMQKfvamji7Lvy2gI7kR928cq6Mn/3bfsSih/HVRNJBfnDsI0iVpNtybqnbsGECwDIilEP+/uuZKJ307KJmYl/2wZ2AHwrGxFKqThCayrQT1ndN6A4HRF61ghESY/hrJQzsj/Qjb0yOP2uekFeszTnDjRcb4beU0+MYN22XC8Eqsv3CKK2K5CvQ3QCW6qOhyRgLRP5nOTCIpi4sAqRkuIYRq9WNSl4VMzxS1X/5BghOVmFr2hdXgPq/gyVqGPSJLyYaDOo1bWomX+/NjEz5u472YulcRGPPWw6MxsXjCDgR9+EpcUiVI3yISbGRXcvP+Y6lUIUor3xRt3dFGKnhj+x8F9JgHg/oSyDYcY7FKfCPesls3hVMX8gq2E1Mm6kZqDNWwlBY0SPbIyJqz5s07vJoO5KRRqYyE6ANU41BSBdXJz6IpgBJ1Og5Y7UKV6ZAbTUfBBf0k+t7F2HYgZbryY8mPYb+DWH4i5JO6pL14nQPrRrdP5FnyUQN3tTvl3pfnhjUfg2D7AXPp4AEpkwUJm+Ip2ys0kReXJw8PtufH+ekNek1OBrJnMTLJ8SM5IqU9V1dFh7ne1LJd5f0E+VA+N2W0Bngi/Khrp3XKr/nYTLwbYIj2AmIBd7vaYsdCj2LGEZNdW890IOW+3KxVQmpaODv5ECZIIHKlpHunOTcu/H/Up7sz+j1s/ApKKUPz7gVvVUG0XBZjW4GpmpgKMMdORjcz5rJzoWP7sonN4r9FpHV/KXzFTc/A+Lb3SHRCok0kuhdNNj/I4x2iJRQ+kTVPfEQQAHAt2xLy4IqtxjF0XT5QM9B/AbZb1sZKgTAMCcSj+uVyeZNZTpRxpwuuB3JngbBRlUyP1gPGIXL10nSCpH1Vq2upbw4XMrOHr/AW8Kjp9YbIChEUcg8aZcv7u9PVyUgeAicNYo5KZwHWv6emvxuk/lscz7L6Kak58MZsmSt0p7xy9TaLc2Rhirdyn8ELbIg/QkT0KWaDr6isy6zw6secsj6PLhh7n+UnJS+6h1vwg8wqjHRJabxoTaPRZ/EiFcAt6D7m1WHKnTz2kZp0m5+i0AkYbGac/pB5R8zjVsLBlinjhF8bli4aMaEx2xmBc4sganR9O+H5MIoiFQea/wUoe1oP8OuEAHz1pn/DDDEc/zAtRdCEBpZaRUtrqKP52DTWnvx7zq270hd40ICNHDtPuaN5bzpPUiQDR9YGvbZaE7h0xySGifQEpLAPj7jTw5YJoFaTw4dk+TDcORXnRQTboKNl3i9wCqQpfXm9XuoIwkWfuaSvo7Al74m10ndHIUDLq5qVITtLGEEVwYY+lUr67WM2z2npk5xpWbG2naYPvxhmAfzMPZoTnyAxwnSKhW0CV8SS6yYLVjh+oGkgJN804JOpVdFf9FSJWHwQRh7eiFOp8MlAu0spmflK51mKY3cqb1GKUJ5RT5j5zXAjadCHrC15TbOefX2FnJpoYF3QqdSvKEN7JrLyxRVNabqHyJWDZsLCih7MCFjL05JslM8RxjrTUGovD/FTtwVGhK4vTudjmC8TsvLYKw152dDWnFBhvqPBb3darYE1xo3Jf+Lxxhvwn016d5EGjj6vwLN13TuyFkdFUy5rJRgiIFFwwEUH4pbEOmULVoRJXOxLUWviDD5sGWcVamndK6mIUUw58rlzO7sQtc=