评论
|
我记得大约一年前在 RPI 上安装 cncjs,这是一个非常令人困惑的尝试。不是因为它实际上很难,而是因为安装说明包含很多不必要的东西和从相关项目复制/粘贴的东西,并且那里的东西包含几个替代方案,包括以令人困惑的方式注释掉的代码。 如果我没记错的话,安装实际上是单行的:
即您期望的任何 js 应用程序。然而,如果您按照说明进行操作,则会遇到各种各样的问题,并且不得不学习很多不必要的东西。我认为这对新的潜在用户来说是一个很大的障碍。从那时起,其中大部分可能已经得到修复,但我的猜测是,通过保持简单而不是尝试提供替代方案,可以获得很多好处。 我不确定我在这里贡献了什么有用的东西,对此感到抱歉。不过我的猜测是,空间和时间方面对用户来说并不是什么大问题,而且纯 JavaScript 的处理方式具有与平台无关且维护成本低的巨大优势。许多软件项目所做的一件事是为安装提供 shell 脚本,为用户提供安装软件的单行代码,例如 nvm do:
这可能是一个解决方案,用于隐藏 npm 的所有令人困惑的输出,并做其他事情,比如设置自动启动。 |
|
确保安装脚本或一种安装程序是可行的方法。 |
|
@tawera阅读当前版本的https://github.com/cncjs/cncjs/wiki/Setup-Guide:-Raspberry-Pi-%7C-Install-Node.js-via-Package-Manager-*(Recommended) * 。它省去了替代品。 不能简单的输入“npm install -g cncjs”,因为不保证已经安装了nodejs,如果安装了可能版本不对,如果需要重新编译串口模块,必须要有工具链。 即使您遵循简化的说明,有些事情也可能出错。例如,完整的 npm 安装过程可能会淹没某些本来可以以某种方式运行 CNCjs 的平台——例如运行我的生产工厂的 Pi Zero W。脚本减少了键入单个命令的工作量。这是一件好事,但以隐藏步骤为代价,因此如果出现问题,就更难解决这些问题。 我的建议是基于我最近支持新用户的经验。我目前是唯一一个似乎在积极与他们互动并解决问题的层面上这样做的人。有几个人在 Facebook 群组上回答问题时给出了 YouTube 视频的指示,这些视频通常根本不回答问题,但很少有人支持“告诉我你做了什么,一步一步”的水平,我们将努力解决它,直到您成功为止”。 这种支持是让我渴望更快程序的另一个因素。当你与某人一对一地工作时,任何需要很长时间的步骤都会增加我们中的一个人由于其他约会而不得不脱离的可能性。这通常意味着第二天必须重新参与。本来可以在一个简短的会议中完成的支持流程可能需要几天的时间,这对所有相关人员来说都是非常令人沮丧的。特别是我。 |
|
只要安装过程可靠,我认为时间和空间问题不是关键。但我同意,因为它不是,它是一个痛点。而 npm/building from scratch-approach 永远不会是最可靠的。 我不是 javascript 开发人员,所以我不知道我在说什么,但也许 Docker 实际上是 cncjs 的最佳解决方案。 缺点是 docker 是一个需要添加到组合中的组件,但它提供了所需的关注点分离。问题是让 cncjs 在所有可以想象的环境中运行,添加编译非 javascript 模块,这使得它非常复杂。使用 docker 将安装减少到两个问题。一,创建一个docker镜像,我相信已经有一个了。第二,在你的系统上安装 docker,这不需要在 cncjs 部分做任何努力。 我确定您已经研究过 docker,但也许这将是最好的前进方式,一旦您的系统上安装了 docker,cncjs 应该非常安全并且您可以在任何地方运行相同的图像。仍然存在将 http 端口、串行设备和配置文件映射到主机的问题。而且我不完全确定 Windows 和 Docker 的故事。 我相信 docker 会负责自动启动、公开端口 80 以及很好地更新 cncjs,并且它在所有平台上的工作方式相同,并且它应该需要 cncjs 部分的最少工作量。当然,从来没有灵丹妙药,但这可能是需要考虑的事情。 |
|
@tawera Docker 并不像人们希望的那样一帆风顺。例如,如果你想让 cncjs 在低端 Pi 上运行,你需要一个不同的操作系统镜像作为 docker 镜像的基础,因为 ARM 体系结构在 Pi 版本之间是不同的。因此,您现在需要处理整个依赖于体系结构的操作系统映像,而不是仅仅担心一个本机代码文件(串行端口)。并且用户必须学习变幻莫测的 Docker 管理,这并不简单 – 图像和容器之间的差异以及挥之不去的停止容器会发生什么,如何持久保存对图像的更改以及如何访问文件等主机资源等等. 我在 Windows 上使用 Docker,因为它是运行我需要的一些 32 位编译器的唯一途径,而且很痛苦。 我尝试构建一个可以在低端 Pi 上运行 cncjs 的 Docker 镜像。我在这个项目上花了几天时间,但从未找到令人满意的解决方案。 我想减少复杂性和图像大小,而不是增加它。 Docker 为您带来的一件事是能够将 cncjs 与兼容版本的 nodejs 捆绑在一起。这种优势是以许多缺点为代价的。 Nodejs 本身是一个“虚拟化层”,从某种意义上说,除了 serialport 二进制文件之外,整个 cncjs 构建映像都是机器无关的。如果只执行一次安装过程,最终会得到一组可以在任何地方运行的文本文件。不再需要 3/4 的安装足迹,因为它用于将 CNCjs 源代码转换为紧凑形式并执行各种准备和测试步骤。剩下的 1/4 可以非常简单地从一个系统复制到另一个系统。 |
如果您采取正确的步骤和正确的检查,特别是对成功步骤的测试,这很容易解决。 |
|
好吧,您需要为每个受支持的架构提供一个编译版本的 serialport,而在 docker 世界中,每个受支持的架构都需要一个图像。事实上,整个系统都是在 docker 镜像中运行的,我不认为这会增加复杂性。事实上,您需要将系统的可变部分和不可变部分分开是一个很好的特性,而不是一个不幸的结果。 我每天在工作中都使用 docker,既用于开发目的,也用于生产系统,对我来说,这是蜜蜂的膝盖,因为它消除了与系统依赖性有关的所有问题,我可以运行我想要的任何 dockerized 软件的任何版本,而不会受到它们的干扰彼此。您定义一次映像,无论它在哪个 docker 主机上执行,它的工作方式都是一样的,其性能与在本地运行它没有区别,并且当您升级主机时,无论您在主机上运行什么其他软件,它都会继续工作。 但我同意,这绝不是解决这个问题的最佳方法,而且你有很多有效的观点,而且显然已经探索了这条道路。如果您可以构建 cncjs 并创建一个 tarball 或类似文件,它将在任何具有受支持节点版本的机器上执行,这对我来说听起来是个不错的计划。我参与了这个讨论,因为我觉得安装体验对于这个伟大的软件来说有点麻烦是一种耻辱,看到它得到改进会很棒。 顺便说一句,新设置指南做得很好!当我设置我的 RPI3 时,我认为说明的第一步是安装 nodejs 7,这对我来说失败了,因为 raspbian 已经预装了 nodejs,所以发生了冲突。我想我最好按照说明使用 nodejs 7,但是我无法卸载现有的 nodejs 版本,因为其他系统包依赖于它们,所以这是第一个障碍。当然最后这一切都是不必要的,但当时我不知道,因为预装的nodejs版本较新,而且cncjs也支持。我注意到新指南指示安装 nodejs 8,您确定这是必要的吗?而且它没有说明起点是什么,即您应该安装什么发行版。 |
|
我不知道nodejs的最低版本是多少。卸载所有内容然后重新安装所有内容以查看效果是相当耗时的。我对整个过程感到非常厌倦。如果您愿意通过创建有效和无效的地图来提供帮助,那就太好了。我认为v8 和 v10 有效,但 v12 无效。 考虑到您可以拥有任何预先存在的 nodejs 版本(或没有)以及任何预先存在的 cncjs 版本,场景的数量非常多。是的,我知道这是 Docker 的一个论点,但是用 Docker 代替上面的 nodejs 并且你有本质上相同的问题。 Docker 镜像可移植到具有相同架构的机器,或者具有足够能力来虚拟化该架构的机器,但是祝你好运,例如,在低端 Pi 上运行基于 AMD64 基础操作系统构建的 Docker 镜像。 |
|
解决这些问题的一种方法是在 raspbian 上为 cncjs 提供适当的包,这应该是最用户友好和最稳定的解决方案。但这也只是 raspbian 的解决方案,并且需要有人创建和维护这些包。 我想 README 是正确的,因为版本 6、8 和 10 可以工作。 raspbian目前有三种不同的安装镜像
我的猜测是 Lite 没有随 nodejs 一起提供,而其他的则有。我目前没有可用的 pi 来测试。无论哪种方式,如果官方回购中有 nodejs 包,它们应该可以通过一个 apt 安装获得,它应该带来默认版本,希望它能与 cncjs 一起使用。这应该是安装 node 的最可靠方法,如果你执行 apt install 并且已经安装了 node,那么它什么都不做。 |
|
下面是在 Raspberry Pi 上通过 npm 安装 cncjs 时可能遇到的问题示例。是的,我知道这不是建议的顺序 – 我的目标是尝试以最直接的方式做事,看看会发生什么。 我们从 Pi Zero W 上的 Raspbian Buster Lite 图像开始,然后 sudo apt 安装 nodejs 那会持续一段时间,然后无法获得 libssl。糟糕,忘了做 sudo apt 更新 这次工作了。到目前为止,一切都很好。但是安装nodejs并没有安装npm,所以我们也要安装它: sudo apt 安装 npm 然后我们测试npm npm -v 看起来有点老了。让我们试试看: $ npm 显然Debian Buster中nodejs和npm的打包版本不是一个级别的。所以 sudo npm install -g npm@latest 那个号称已经安装了npm@6.13.4,但是当你运行npm时,它仍然运行5.8.0。什么鬼?也许打包的 npm 二进制文件位于搜索路径前面的不同目录中? 是的。好吧,这太奇怪了: pi@pi0:~ $ npm 用法:npm 其中之一是: npm -h npm 的快速帮助 在 ini 格式的文件中指定配置: npm@5.8.0 /usr/share/npm 那么,即使 /usr/local/bin 版本在搜索路径中较早,npm 是如何从 /usr/bin 运行的????? 哦,臭名昭著的 bash 路径缓存。多年来我从未想过这一点。所以 pi@pi0:~ $ type npm 想象一个非程序员能够解决这个问题! 时间 sudo npm install -g –unsafe-perm cncjs 它在 26 分钟后完成,cncjs 工作(没有本地桌面,从另一台机器上的浏览器访问 cncjs)。 |
|
如果发行版提供的节点和 npm 坏了,那就不是办法了,但这有点令人惊讶。也许 raspbian 上的节点包没有得到很好的维护,或者这只是一个即将修复的异常? |
|
在 40 多年的时间里,我使用过(并为分发的公司工作过)数十种 Unix 和类 Unix 系统,这对我来说一点也不奇怪。让发行版中的每个包都恰到好处的组合问题,面对每个包的版本变动,以及成千上万的独立包作者,本质上是棘手的。即使像微软和苹果这样拥有庞大资金充足的测试团队并直接控制大部分软件的大公司也会犯错误。 npm 是一团糟。“sudo apt install npm”获得 246 个子包,包括 gyp、5 个 lib* 和 240 个相当小的 node-*。安装过程生成大约 1000 行输出,对于非程序员来说毫无意义。这种用户的典型反应是“我马上就迷路了”。然后,当您尝试使用它时,您收到的第一条消息是它已过时。所以你必须使用不同的命令来更新它(sudo npm install -g npm),并且会生成一组完全不同的长消息,并将新版本安装在无法立即找到的不同位置(因为bash 缓存的东西)。从应用程序部署的角度来看,这简直就是一场灾难。 然后,当(如果有的话)你解决了 npm 安装问题,你用它来安装 cncjs,只是看到一大堆难以管理的输出,上面充斥着关于不安全的东西的可怕警告,你(意思是程序员)真的应该使用较新的版本,并呼吁金钱和工作,以及关于真正晦涩的 C++ 语法问题的颜色鲜艳的编译器警告,这些问题在最近的一些特性被添加到 C++ 中之前根本不存在。所有这些对于天真的用户来说真的很可怕,如果确实存在错误,他们很可能无法在所有其他内容中找到它。当然,程序员只会 grep 查找日志文件中的错误,但程序员不是观众。 我理解以节点做事方式为代表的细粒度模块化的智力吸引力和对开发人员的实用性,但是当您的目标是交付一个“可以正常工作”的应用程序时,它会带来一些严重的缺点。顾客”。 让我们假设这个包装问题很快就会得到解决。作为一个想帮助人们使用 cncjs 的人,这对我有何影响?我是否告诉他们他们必须等到它被修复(如果有的话)?或者我是否发布了一个现在有效的复杂方法,但在它得到修复后可能会出错,然后继续轮询发行版以查看它是否得到修复?然后什么?“如果你使用版本 a,那么你必须做 x,但如果版本是 b,那么你做 y,无限”。用户不喜欢决策树。 我发现能够说(以执行这些步骤的命令的形式)非常有吸引力
|
|
嗯,提供的节点和 npm 版本不兼容我不得不想象这将是任何主流 linux 发行版中的一个关键问题,但 Raspbian 可能根本不关心节点支持,我不知道。 我认为没有人反对您的方法。将节点作为单一依赖项而不必从头开始构建所有内容将是一个很大的改进。 |
|
我会说安装程序脚本很好,只是因为这种事情。它可以很容易地检查是否安装了正确的 npm 版本并抛出错误,甚至要求更正它。 |
|
找到了一个工具prebuildify,貌似可以解决打包多版本原生模块的问题。它为不同的架构、node ABI 版本和 node-vs-electron 构建原生二进制文件,将它们放在一个目录中,node-gyp-build 可以为运行时系统选择正确的目录。 我还在 Raspberry Pi Zero W 上进行了一些安装时间研究,这可能是运行 CNCjs 的最慢且成本最低的系统。差异是惊人的:
|


许多新用户在必须执行“npm install”的系统上遇到安装问题。可以安装electron app的用户,因为有包罗万象的包,所以难度较小,但必须通过npm安装的用户,就麻烦多了。有许多步骤会生成大量非程序员难以理解的输出。
串口模块是最常见的麻烦源。有时它必须被编译,这需要一个巨大的编译器工具链,在 Windows 上经常无法正确安装。在其他情况下,存在预编译的二进制文件,但由于必须为电子应用程序降级版本的问题,它是错误的版本。即使它编译正确,也会有很多让人困惑的警告。
即使一切正常,由于 npm 必须下载所有内容,安装也可能需要很长时间。
我认为我们可以制作一个小得多的图像,可以在任何地方使用。这个想法是只选择那些在运行时需要的文件——省略许多只在编译和测试期间使用的模块——并为最重要的系统添加预编译的串行端口二进制文件。我试过这个的“选择”部分,效果很好。与 npm 安装的 223 MB 未压缩大小相比,生成的 tarball 很小——从 10 MB 扩展到 63 MB。
我认为这样的事情会让新用户更容易采用 cncjs,并且更容易升级到新版本。