评论
Aargh,在运行 70 分钟后,我今天的构建尝试第四次崩溃了。幸运的是,我打开了一个“htop”窗口,所以我看到了发生了什么——它耗尽了内存和交换空间。webpack.webconfig.production.js 产生了 9 个子进程,它们一起用完了所有系统内存。 |
我在 PC 上构建了 dist/cnc/web 目录并将其复制到 Pi。那奏效了。 |
我相信某处有可用的 raspberry pi 映像,这可能有帮助吗? |
我不想重新映像 SD 卡,因为那样我将不得不重新配置网络设置、重新加载我保留在系统上的所有 GCode 文件、恢复我的脚本以重置附加的 Arduino 等。 理想的预编译工件是一个 apt 包,它只包含运行 CNCjs 所必需的文件——基本上是 dist/ 子目录的内容,没有 node_modules 中 210 MB 的 41,000 多个文件。webpack“编译”过程本质上是将 210 MB 压缩成大约 5 MB 的内容,然后放入 dist/ 。您仍然需要 node_modules 中的一些模块,但显然不多。 我认为,在运行时你只需要 8 个,而不是 node_modules/ 中的 1386 个模块,即 babel-polyfill、deep-keys、ensure-array、eventemitter3、http-proxy、requires-port、serialport 和 socket.io . 我通过将 node_modules/ 移动到不同的名称,启动服务器以查找错误消息,并使用必要的信息逐步重新填充 node_modules/ 来获得该列表。在我恢复了这 8 个模块之后,cncjs 运行得很好。在某些情况下,稍后可能会按需加载其他一些,但我似乎只用了这 8 个就拥有了全部功能,总共 10 MB,其中 9 个是 babel-polyfill 。也许您真的需要在压缩 index.js 的“module.exports = require()”行中列出的每个模块;如果是这样,那就是65个模块,远少于1386个。 该问题还有其他解决方案。本质问题是 cncjs 设置在很大程度上针对开发人员角色进行了调整,包括仅在编译和测试期间需要的大量内容。 |
嗯,知道是否有办法以某种方式使构建过程稍微去并行化吗?听起来它可能会因为内存和交换耗尽而偶尔出现彻底的 OOM 故障,从而使交换(因此超长时间)变得混乱。如果有办法让它主要是串行的……那可能会更快。讽刺地。? |
降低并行度肯定有帮助——打破“并发”规则是朝着正确方向迈出的一步。可能有一些方法可以降低多线程的程度,我似乎记得去年在做 cncjs 时曾在某个时候发现过它。节点生态系统非常广泛,除非经常使用它,否则很容易迷路和忘记东西。 |
最近我将 webpack 从 v3 升级到 v4,构建时间应该比以前的版本快一点。 要消除测试和 linting 步骤,您可以单独运行
请注意,以下 webpack 配置文件中有一个 eslint 加载程序插件:
我可以添加一个 env 变量 |
文件夹中的所有文件 您认为有必要提供一个仅包含 |
拉出最新的 因此,我改为使用binfmt_misc qemu arm 编译魔法设置在我的笔记本电脑上从 Docker 构建 cncjs。这在 macOS Docker 中开箱即用,但需要针对 Linux 进行一些配置。我不确定 Windows。我还必须在 Docker 设置中将 Docker 容器的可用内存从 2gb 增加到 4gb。 从
然后我将和目录与 Pi
这仍然需要 28m37.662s(根据 |
@johnboiles 您必须如下更改构建过程:
|
我编辑了上面引用的评论以反映新名称。@johnboiles,如果您对 Wiki 有编辑权限,也许您会考虑在 Pi 部分制作一个页面来描述该过程。如果你没有许可,我希望@cheton考虑到您最近的贡献有多大帮助,会将您添加到团队中。(现在回到工作流争吵!) |
关于上面报告中的“我不确定 Windows”——它确实适用于 Windows。我已经在 Windows、原生、Docker/ubuntu 和 WSL/debian 上尝试了 3 种不同的模式。在所有情况下,应用程序的 Web 部分都可以复制到 Pi。 |
整洁的。是的,看起来Windows Docker 支持开箱即用地运行 ARM 容器。
需要明确的是,如果您使用我的命令,您将在 Docker 容器中同时构建“Web 部件”和“服务器部件”,然后将它们发送到 Pi。 |
啊哈!事实证明,您真正需要在 arm 上构建的唯一东西是串行端口模块。服务器和应用程序都是独立于平台的,除了那个模块。 我刚刚从 PC Linux 构建(实际上是 WSL)中提取(压缩)node_modules/、bin/ 和 dist/,将它们 scp 到 Pi,解压缩,并替换了子目录 node_modules/@serialport与一个建立在 Pi 上的。有效! 在 Pi 上进行 scp 和解压并不是很快,但它比使用 npm 填充 node_modules 快得多。我本可以使用 rsync 或将 tar / untar 合并到 scp 管道中更快地完成它,从而消除一些 Pi 磁盘写入,但对于第一次尝试,我想逐步完成。 这开辟了一个几乎与平台无关的 tarball 的可能性,您可以使用更短的序列为机器进行个性化设置。 |
可以只构建 serialport ARM 二进制文件
在 Pi Zero 上只需不到 2 分钟。所以完整的过程是这样的:
|
好的调查@MitchBradley!作为您流程的变体,您可能也可以使用我的 Docker 技巧在本地构建串行端口,然后发送整个包。我今晚试试这个: 在快速机器上(替换
在 pi 上,只是 编辑:试过了,成功了!在我的 2.8GHz i7 Mac 上,这 4 个命令只用了 3 分钟 30 秒。 |
我的运气就没那么好。首先,我使用的是 Pi Zero,它是 arm32v6,而不是 v7。表面上这是一个合适的图像 – armv6/node:current-alpine(但我必须记住如何登录到 dockerhub 才能获取它)。在我使用 无论如何,考虑到以下因素,在主机上构建串口几乎没有速度优势:
|
我花了不到 30 秒的时间在 docker 中编译串口。但那是因为我一直在运行 Docker。如果你必须启动 docker,我完全理解这会耗尽你节省下来的时间。 有趣的是,Docker multiarch 在 Windows 上并不是开箱即用的。我认为 Mac 和 Windows 上的 Docker VM 已经设置好了。 |
事实证明,您要么需要一个已经包含 /usr/bin/qemu-arm-static 的映像,要么必须从命令行绑定挂载它。那个 hypriot/rpi-node 图像里面有它,而 arm32v*/node 图像没有。我不确定多架构设置步骤是否必要。也许它已经设置好了,而我深陷鼠洞,以至于我没有弄清楚。无论如何,我的 Docker Fu 很弱,而且我很少使用它,以至于它在使用之间往往会消失。 我想在主机上编译串口的一个好处是你不必在 Pi 上安装 npm。也许你可以只使用 node 而不是 NPM。当然,串口构建的事情归结为 C++ 编译,所以您可以在没有 npm 的情况下手动完成。 这个生态系统需要大量的编译器争论。我以为我厌倦了摆弄 C 编译器设置,但这是一个完全不同的膨胀程度。 |
是的。js/node/npm 是“有趣的”。不是很好。? |
The following attachment contains the files necessary to run cncjs on a Raspberry Pi, except for the serialport module. It was created by running the docker image under Linux and then executing this command:
Copy it to a Pi and then:
The result of that will be a functional cncjs installation in the directory ~/cncjs-1.9.20 . You can run it with
|
在 Raspberry Pi 上安装真的很慢而且经常崩溃。存在许多问题,包括“并发”规则的资源耗尽、长 lint 时间和 build-prod-web 的长时间。这太糟糕了——通常需要一天多的时间才能最终成功——除非绝对必要,否则我通常会避免升级。
我想知道是否有某种方法可以加快速度?例如下面的想法:
其他想法?