如何将nodejs编译为单个完全静态的二进制文件

时间:2013-07-30 09:45:02

标签: node.js static compilation

有谁知道如何将nodejs静态编译为单个可执行二进制文件? 我的意思是不需要共享库。

旧版本nodejs有一些指南,但不适用于最后一个。

谢谢!

6 个答案:

答案 0 :(得分:2)

您可以使用nodejs-static docker image获取与musl libc链接的静态编译的Node.JS二进制文件。

https://hub.docker.com/r/dundee/nodejs-static/

答案 1 :(得分:2)

对于仍然发现此主题相关的人,有一个名为node-packer的项目,它编译javascript代码以及此处可用的nodejs二进制文件https://github.com/pmq20/node-packer但是为了拥有真正的静态构建,需要修改ruby脚本并添加标志--fully-static和--without-npm,这应该使二进制文件能够在没有libstdc ++或glibc的情况下运行,但是在nodejs wiki上有一些注意事项。我已经在这里进行了修改(https://github.com/cmosh/node-packer),只需将标志--static附加到命令,即nodec --static foo.js.另外,为了运行它,您需要安装ruby和nodejs并在克隆的repo的bin文件夹中运行nodec脚本。

答案 2 :(得分:1)

实际上,我想在android平台上运行一个静态二进制文件。

现在,直到版本0.11.8,node.js正式添加了android支持。

我的同事不仅建立了arm,还建立了android-x86。一切正常!

https://github.com/joyent/node/commit/5e4e8ec429381a8d1eebe31647e9daaaae42c54b

答案 3 :(得分:0)

同时有http://enclosejs.com/似乎能够生成单个二进制文件。

答案 4 :(得分:0)

这是另一个可以将您的应用程序打包在一个可执行文件https://www.npmjs.com/package/pkg

中的文件

答案 5 :(得分:0)

如丹尼尔·米尔德(Daniel Milde)所指出,https://hub.docker.com/r/dundee/nodejs-static/是一种选择,但已过时,并且没有公开Dockerfile,不会激发信任。

我已经从头开始在容器中逐个节点对它进行了测试,并且它起作用了。

您可以构建自己静态链接的节点。

~/src$ git clone https://github.com/nodejs/node
cd node
~/src/node$ ./configure --help | grep static
  --fully-static        Generate an executable without external dynamic
  --partly-static       Generate an executable with libgcc and libstdc++
  --enable-static       build as static library
                        link to a shared http_parser DLL instead of static
    --shared-libuv      link to a shared libuv DLL instead of static linking
    --shared-nghttp2    link to a shared nghttp2 DLL instead of static linking
    --shared-openssl    link to a shared OpenSSl DLL instead of static linking
    --shared-zlib       link to a shared zlib DLL instead of static linking
    --shared-cares      link to a shared cares DLL instead of static linking
~/src/node$ ./configure --fully-static --enable-static
~/src/node$ make

...

~/src/node$ file out/Release/node 
out/Release/node: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=e5be29b02e283d0efdfc313e409b1a0802bd0603, with debug_info, not stripped
~/src/node$ /lib64/ld-linux-x86-64.so.2 --list out/Release/node 
        statically linked
~/src/node$ 

让我们从头开始使用docker容器进行测试:

~/src/node$ cat > /tmp/Dockerfile.node-static <<EOF
FROM scratch
COPY out/Release/node /node
CMD /node
EOF
~/src/node$ docker build -t glaudiston/node-scratch -f /tmp/Dockerfile.node-static .
Sending build context to Docker daemon  1.239GB
Step 1/3 : FROM scratch
 ---> 
Step 2/3 : COPY out/Release/node /node
 ---> ec9d62bb7eb0
Step 3/3 : CMD /node
 ---> Running in 2e375fc580f7
Removing intermediate container 2e375fc580f7
 ---> 5d6a2b5f20b8
Successfully built 5d6a2b5f20b8
Successfully tagged glaudiston/node-scratch:latest
~/src/node$ docker run -ti glaudiston/node-scratch /node
Welcome to Node.js v12.0.0-pre.
Type ".help" for more information.
> var x = { 'test': 123 };
undefined
> x.test
123
> 

您也可以在Dockerfile中构建它,也许我会做。

现在,您可以使用我的公共docker映像glaudiston / node-scratch

~/src/node$ docker push glaudiston/node-scratch
The push refers to repository [docker.io/glaudiston/node-scratch]
9251f7e82698: Pushed 
latest: digest: sha256:c6f2154daa0144abafc0a7070c48f0c4031a036901c75d432b8c826ae793a1d7 size: 529