为Nodej配置webpack,以便您可以使用绝对路径运行应用程序

时间:2017-10-13 11:50:54

标签: javascript node.js webpack

我有一个Nodejs项目,我想为其创建一个可执行文件,但我也想将它用作我可以在其他项目中导入的模块。

我正在使用Webpack捆绑所有内容并创建可执行文件,如果我从项目目录运行脚本,它可以正常运行。如果我尝试从另一个路径运行脚本,那么我得到一个ENOENT:没有这样的文件或目录错误。

我的项目结构:

project_root
     |
     |-- lib
          |-- dependent_library.js
          |-- dependent_library_2.js
     |-- index.js
     |-- cli.js
     |-- some_script.sh
     |-- webpack.config.js

我的webpack.config.js

const webpack = require('webpack')

module.exports = {
   entry: './cli.js',
   target: 'node',
   node: {
      __dirname: true
   },
   output: {
      path: __dirname,
      filename: 'my_executable'
   },
   plugins: [
      new webpack.BannerPlugin({
         banner: '#!/usr/bin/env node\n',
         raw: true
      })
   ]
}

我的fs.readFileSync(__dirname + '/../some_script.sh')文件中有一个dependent_library.js。此文件导入cli.js文件,该文件是webpack的入口点。我运行webpack,它捆绑了我的可执行文件,一切都很好。

当我想从../project_root或系统中的其他路径运行可执行文件时出现问题,这显然是我想做的事情。

  

e.g。我的项目在/home/my_user/workspace/project_root/。我cd到   /home/my_user/workspace/并运行project_root/my_executable

这是我收到以下错误的地方:

Error: ENOENT: no such file or directory, open 'lib/../some_script.sh'

我确定有一种方法可以配置Webpack以使这个场景有效,但我还没弄明白怎么回事。任何人都有任何想法?

1 个答案:

答案 0 :(得分:0)

我最终使用@ Keith的答案和一些代码更改的组合

我已经设定:

node: {
   __dirname: false
}

我还更改了dependent_library.js以检查脚本是否存在于当前目录中。因此,如果存在__dirname + /some_script.sh,那么它只会读取它 - 这就是运行可执行文件时会发生的情况。不同之处在于,当webpack节点.__ dirname选项设置为false时,__ dirname将返回可执行文件的绝对路径。

如果__dirname + /some_script.sh不存在,那么它会尝试阅读__dirname + /../some_script.sh - 我们假设项目是作为模块导入的。因为运行此代码的库位于project_root / lib中,所以我们需要返回一个级别。