我有一个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以使这个场景有效,但我还没弄明白怎么回事。任何人都有任何想法?
答案 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中,所以我们需要返回一个级别。