node-packer
node-packer copied to clipboard
折腾了许久,提一些碰到没能自己解决的问题。
-
[x] 1. 需要一个 比较完整的示例,仅仅是一个
console.log('hehe')
的npm package也好呀。 -
[x] 2. 编译的a.exe 可以运行,可是转移到其他相同平台(比如另外一台Windows 10系统),它就不能工作了,一直报找不到module。甚至找不到package.json。
-
[x] 3. 编译自己的 npm package (未 npm publish) 一直报不存在package.json (例如叫test的npm package,package.json就在/test/下,它硬是说不存在,哪怕是在不同的地方建 a , b 两个npm package,然后在 b 中安装 a ( a 已经全局安装 ) 到 b 的 node_modules下,再在 b 的所在的项目根目录执行
nodec --npm-package=a
,这样都报找不到a 的package.json 文件。。。。可实际上它就在那里呀); -
[x] 4. 继续2 的问题,通过
npm install -g .
得到npm package和通过编译出来的a.exe 在本机运行没有问题,功能一致,可是换台机器就不行了。如果nodec 得到的.exe不能这样(跨机器使用)的话,这和在npm的项目的package.json中加"bin":{"./index.js"}
然后再npm -i -g .
没什么区别——就运行结果而言。
你们提供了不少的命令参数, 可能我碰到的问题是没有理解怎么搭配、拼接这些配置项造成的,没有高级语言基础,还请开发者帮忙答疑解惑,仰望中默默等待......
And in english? What do you mean ?
😭 oh, let me try:
- The a.exe file can not be run on other windows system machines (both windows 10 x64 they are). Even add to the system environment variable (PATH). error:
C:\Users\aaaaaaaaaaaaaaa>semt -h
module.js:491
throw err;
^
Error: Cannot find module 'C:\__enclose_io_memfs__\package.json'
at Function.Module._resolveFilename (module.js:489:15)
at Function.Module._load (module.js:439:25)
at Function.Module.runMain (module.js:609:10)
at startup (bootstrap_node.js:167:16)
at bootstrap_node.js:587:3
# I compiled it on another machine use the command: `nodec index.js` ,then copy the a.exe file to this machine.
- I think maybe I should compile the entire npm package. but, when I used the command:
nodec --npm-package = stnouausehgforbdm indfex --skip-npm-install
(it can not be downloaded from npm because it is not yet published, it's just a local npm package) to try it again.
error:
D:\WorkSpace\Business\builders>nodec --npm-package=stnouausehgforbdm index --skip-npm-install
Node.js Compiler (nodec) v1.5.0
- entrance: index
- options: {:npm_package=>"stnouausehgforbdm", :skip_npm_install=>true, :npm=>"npm", :make_args=>"-j4", :vcbuild_args=>"x64", :output=>"D:/WorkSpace/Business/builders/a.exe", :tmpdir=>"C:/Users/xxxx/AppData/Local/Temp/nodec", :npm_package_version=>"latest"}
=== WARNING ===
Please make sure to have installed the correct version of node in your environment.
It should match the enclosed Node.js runtime version of the compiler.
Expecting v8.3.0; yet got v8.9.1.
-> mkdir -p C:/Users/xxxx/AppData/Local/Temp/nodec
-> rm -rf C:/Users/xxxx/AppData/Local/Temp/nodec/stnouausehgforbdm-latest
-> mkdir -p C:/Users/xxxx/AppData/Local/Temp/nodec/stnouausehgforbdm-latest
-> cd C:/Users/xxxx/AppData/Local/Temp/nodec/stnouausehgforbdm-latest
-> cd D:/WorkSpace/Business/builders
-> rm -rf C:/Users/xxxx/AppData/Local/Temp/nodec/__work_dir__
-> mkdir -p C:/Users/xxxx/AppData/Local/Temp/nodec/__work_dir__
-> cp -r "C:/Users/xxxx/AppData/Local/Temp/nodec/stnouausehgforbdm-latest" "C:/Users/xxxx/AppData/Local/Temp/nodec/__work_dir__/__enclose_io_memfs__"
-> cd C:/Users/xxxx/AppData/Local/Temp/nodec/__work_dir__/__enclose_io_memfs__
-> cd D:/WorkSpace/Business/builders
-> cd C:/Users/xxxx/AppData/Local/Temp/nodec/__work_dir__/__enclose_io_memfs__
No package.json exist at node_modules/stnouausehgforbdm/package.json.
will report the same error both they are:
nodec --npm-package=stnouausehgforbdm index --skip-npm-install
nodec --npm-package=stnouausehgforbdm index.js --skip-npm-install
nodec --npm-package=stnouausehgforbdm package.json --skip-npm-install
This npm package (stnouausehgforbdm) no static files,just require base modules of node.js ,likes "fs" ,"os",third npm package:"del",and so on.
Ok, Hope someone knows what I'm talking about except Google Translate.(😿
I understand now 😁
As far as I know node-packer, it doesn't manage npm packages the right way every time. Specially if you package is not published. The workaround is to install your packages as usual into your app, and then calling node-packer like that
node-packer/bin/nodec -r app_root_dir/ -o app.out --skip-npm-install app_root_dir/bootstrap.js
It works every time
@YYago 简单的说,不要在windows下玩,估计作者最开始压根就没想过windows的兼容性。我们的使用经验是在linux下玩的很好,只要处理好和文件相关操作。node-packer的核心类似于“固件”虚拟nodejs系统,只要用区分好虚拟文件系统和真实文件系统,一般来说就没什么问题了。
针对第三点编译整个project找不到package.json问题, 直接编译入口文件就好了. 比如你的入口文件是main.js, 那么 nodec yourProject/main.js
它会将其他依赖一起打包进去
我是用:nodec --npm-package=appium a.exe 命令行,想把node.js的appium包打包成exe文件。环境已经配置好,但是当遇到appium安装包包含的chromedriver.exe时,发生了错误。有哪位高手,能解决node.js包里如果含有.exe的文件,使用node-packer该如何打包。打包过程的日志如下:
2001 silly diffTrees add [email protected]
2002 silly diffTrees add [email protected]
2003 silly diffTrees add [email protected]
2004 silly diffTrees add [email protected]
2005 silly diffTrees add [email protected]
2006 silly diffTrees add [email protected]
.......
.......
.......
12010 info lifecycle [email protected]~install: [email protected]
12011 silly install [email protected]
12012 info lifecycle [email protected]~install: [email protected]
12013 silly install [email protected]
12014 info lifecycle [email protected]~install: [email protected]
12015 silly install [email protected]
12016 info lifecycle [email protected]~install: [email protected]
12017 silly install [email protected]
12018 info lifecycle [email protected]~install: [email protected]
12019 silly install [email protected]
12020 info lifecycle [email protected]~install: [email protected]
12021 verbose lifecycle [email protected]~install: unsafe-perm in lifecycle true
12022 verbose lifecycle [email protected]~install: PATH: D:\Node_Pkg_Test\node-v8.2.0-win-x64\node_modules\npm\bin\node-gyp-bin;C:\Users\FcGxy\AppData\Local\Temp\nodec_work_dir__enclose_io_memfs_\node_modules\appium\node_modules\appium-chromedriver\node_modules.bin;C:\Users\FcGxy\AppData\Local\Temp\nodec_work_dir__enclose_io_memfs_\node_modules\appium\node_modules.bin;C:\Users\FcGxy\AppData\Local\Temp\nodec_work_dir__enclose_io_memfs_\node_modules.bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;D:\Miniconda3\envs\py27;D:\Node_Pkg_Test;D:\Node_Pkg_Test\node-v8.2.0-win-x64;D:\Node_Pkg_Test\sqfs43-win32
12023 verbose lifecycle [email protected]~install: CWD: C:\Users\FcGxy\AppData\Local\Temp\nodec_work_dir__enclose_io_memfs_\node_modules\appium\node_modules\appium-chromedriver
12024 silly lifecycle [email protected]~install: Args: [ '/d /s /c', 'node install-npm.js' ]
12025 silly lifecycle [email protected]~install: Returned: code: 1 signal: null
12026 info lifecycle [email protected]~install: Failed to exec install script
12027 verbose unlock done using C:\Users\FcGxy\AppData\Roaming\npm-cache_locks\staging-aa6a1f635d84883c.lock for C:\Users\FcGxy\AppData\Local\Temp\nodec_work_dir__enclose_io_memfs_\node_modules.staging
12028 warn enclose_io_memfs No description
12029 warn enclose_io_memfs No repository field.
12030 warn enclose_io_memfs No license field.
12031 warn optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules\fsevents):
12032 warn notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
12033 verbose notsup SKIPPING OPTIONAL DEPENDENCY: Valid OS: darwin
12033 verbose notsup SKIPPING OPTIONAL DEPENDENCY: Valid Arch: any
12033 verbose notsup SKIPPING OPTIONAL DEPENDENCY: Actual OS: win32
12033 verbose notsup SKIPPING OPTIONAL DEPENDENCY: Actual Arch: x64
12034 verbose stack Error: [email protected] install: node install-npm.js
12034 verbose stack Exit status 1
12034 verbose stack at EventEmitter.node install-npm.js
12043 error Exit status 1
12044 error Failed at the [email protected] install script.
12044 error This is probably not a problem with npm. There is likely additional logging output above.
12045 verbose exit [ 1, true ]
@Ni-vek I tried the command for egg-bin
can not work.
Reproduce step like this:
cd ~/temp
git clone https://github.com/eggjs/examples.git
cd examples/helloworld
npm i
cd ../..
mkdir nodec-test
cd nodec-test
node-packer/bin/nodec -r ~/temp/examples/helloworld -o helloworld.server --skip-npm-install ~/temp/examples/helloworld/node_modules/egg-bin/bin/egg-bin.js
After compiled, run this:
./helloworld.server dev
Got this error:
⚠️ AssertionError [ERR_ASSERTION]: /Users/yourname/temp/nodec-test/package.json should exist
⚠️ Command Error, enable `DEBUG=common-bin` for detail
@YYago 你的第二个问题,那个放到其他路径就各种找不到的问题解决了吗
@VincentWuShiChao
以前是不太了解node.js的模块引用关系。现在的话会好些吧:
- 明确入口文件。前面JesseWo 提到的https://github.com/pmq20/node-packer/issues/103#issuecomment-388576143(这点能解决找不到package的问题):
针对第三点编译整个project找不到package.json问题, 直接编译入口文件就好了. 比如你的入口文件是main.js, 那么
nodec yourProject/main.js
它会将其他依赖一起打包进去
- 项目引用的模块文件应该均在项目根目录下,某些第三方
.exe
程序应当做通用性处理,比如puppeteer这种包——在代码中应该使用用户电脑的通用chrome浏览器启动程序所在路径,而不是当前puppeteer包所安装的Chromium,并在构建时跳过安装:--skip-npm-install
。比如前面 @DleCu DleCu 提到的https://github.com/pmq20/node-packer/issues/103#issuecomment-408664122
如有必要需要额外用代码做运行环境、完整性检查,在首次运行之前把需要的文件、程序通过创建、下载安装补齐。因为这些EXE程序是包含它的npm 包二次安装或者编译完成的,要想能打包之后能正常运行就必须把这些依赖文件补齐。
- 在使用本地包(不是从npm下载安装的包)时,应当把包的核心文件(最好是整个包项目文件)都拷贝到当前项目目录下并重建包(
npm init
),然后通过require('./...')
方式引用——这一点只是我的个人建议,引用的本地的npm包应该是没有被加载到当前/node_modules
目录下的——例如这种包安装方式:
"dependencies": {
"myPack": "D:/packroot/mypack/index.js",
}
没有测试以上这种安装方式是否能被准确编译进去。
- 静态文件应该尽量用额外的代码重新创建或者下载到用户机,因为静态文件可能不被编译进去。
- 留意路径问题(决对路径和相对路径)。
@YYago 我的打包的是egg项目,然后指定的入口文件是:
nodec node_modules/egg-bin/bin/egg-bin.js
最后打包也能成功,在项目根目录下启动a.out文件也能正常启动项目,但是
- 单独把a.out文件放的一个其他独立的位置再执行就会出现node_modules找不到
- 或者找不到路由的情况 您有类似的经历没有