使用webpack输出可执行文件

tay*_*c93 6 node.js webpack

我目前正在编写节点CLI工具,并使用webpack捆绑我的所有资产。该应用程序的入口点是js文件,我实际上在其中解析process.argv并运行命令(供参考,我使用的是tj / commander)。这样,一旦捆绑完成,我就可以输入./<outputFile>,它将运行我的应用程序。入口文件如下所示:

import cli from './cli';

cli.parse(process.argv);

// If nothing was supplied
if (!process.argv.slice(2).length) {
  cli.outputHelp();
}
Run Code Online (Sandbox Code Playgroud)

捆绑工作正常,但我无法通过webpack将文件输出为可执行文件。一旦我跑步chmod +x <outputFile>,一切都会正常进行。有没有一种方法可以告诉webpack授予输出文件什么权限?

elb*_*ire 7

我很惊讶没有人对 webpack 的BannerPlugin. 我做了一些与@oklas类似的事情,但BannerPlugin用于添加特定节点 shebang:

{
  plugins: [
    new webpack.BannerPlugin({
      banner: '#!/usr/bin/env node',
      raw: true,
    }),
  ],
}
Run Code Online (Sandbox Code Playgroud)

然后我只需将执行权限添加chmod到我的package.json文件中:

"scripts": {
  "build": "webpack && chmod +x dist/mycommand"
}
Run Code Online (Sandbox Code Playgroud)

无论如何,如果您只想使用 webpack,您可以使用WebpackShellPlugin,正如 oklas 所说(请注意,使用它会强制您添加新的依赖项,这就是我避免使用这种方法的原因):

const WebpackShellPlugin = require('webpack-shell-plugin')
{
  // [...]
  plugins: [
    new WebpackShellPlugin({
      onBuildEnd:['chmod +x dist/mycommand'],
    }),
  ],
}
Run Code Online (Sandbox Code Playgroud)

如果你想避免包含WebpackShellPlugin作为依赖,你可以尝试定义一个基于 的自定义插件fs,如@taylorc93所说


okl*_*las 5

一种简单的方法是使用npm。你有一个package.json在你的项目?添加"build": "webpack && chmod +x outputFile"scripts您的部分,package.json然后通过运行构建项目npm run build

另一种方法是将以下解决方案之一添加到您的webpack.config.js

无论选择什么,都需要添加以下代码:

var chmod = require('chmod');
chmod("outputFile", 500);
Run Code Online (Sandbox Code Playgroud)