开源改变世界

无法从源代码构建 #562

推推 grbl 2年前 (2023-02-04) 339次浏览
关闭
whitty 打开了这个问题 2019 年 10 月 3 日 · 19条评论
关闭

无法从源代码构建#562

whitty 打开了这个问题 2019 年 10 月 3 日 · 19条评论

评论

无法从源代码构建 #562
合作者

嗨 LaserWeb 的朋友们?

通过发布页面上的二进制文件,我已经使用 LaserWeb 几天了,并且对该软件的运行情况总体上感到满意!我还在熟悉这个项目,所以我希望你能多多包涵。

问题

我想为这个项目做贡献,所以我克隆了 repo 并运行npm installand npm run installdev. 此时,npm start失败并出现与依赖项相关的错误:

TypeError: require(...).load is not a function
    at Object.<anonymous> (<...>/LaserWeb4/node_modules/lw.comm-server/config.js:1:81)

这是由于lw.comm-server库中预期的版本与正在安装的版本不匹配。该模块的package.jsonspecifying "dotenv": "*",并且似乎有重大变化dotenv(人们require('dotenv').configure(...)现在使用)。

再深入一点,我注意到在这个 repo 的文件package-lock.json中故意忽略了npm 5。.gitignore此回购协议中的 A可以在短期内阻止重大更改,但如果人们独立处理软件包package-lock.json,问题仍会自行显现。lw.comm-server

我还注意到,在运行npm run start-app时,webpack 构建由于缺少object.omit依赖项而失败。果然src/reducers/index.js从 imports 了object.omit,但是依赖没有列在package.json. 我认为这对人们有用,因为它作为传递依赖存在?

建议

这是我到目前为止所得到的。我有一些建议,我认为这些建议会在未来为更多的第三方贡献开放这个项目。我已将它们从最小范围订购到最大范围:

  1. package-lock.json从这个 repo 的文件中删除.gitignore并提交一个工作package-lock.json到 repo

    此更改至少应该使其他开发人员能够处理此项目,而无需花费太多时间来处理依赖项。

  2. package.json为这个 repo 的所有 s 以及其他lw.*包使用确切的包版本

    像这样的东西"dotenv": "*"package.json. 相反,我建议安装带有--save-exact标志的软件包以固定到确切的版本。除了package-lock.json更改之外,此策略还应消除与依赖项和传递依赖项中的破坏性更改相关的一类问题。

    这里的权衡是人们不会总是“免费”从新版本的软件包中获得最新功能。事实是他们从来没有真正免费得到它们。开发人员 A 可能会更改为使用 2.6 版软件包中引入的方法,而开发人员 B 仍在使用 2.5 版。开发人员 B 可能会提取开发人员 A 的更改并注意到代码已损坏。开发人员 B 无法知道开发人员 A 是否编写了错误代码,或者与开发人员 A 的本地设置相比,开发人员 B 的软件包是否过时。要求开发人员在回购中保存包的确切版本消除了这种歧义。

    Greenkeeper这样的工具可以减少保持包最新的摩擦。根据我的经验,这实际上并不像人们期望的那样必要。

  3. 引入 CI 工具以确保此 repo 始终可以从源代码构建

    我注意到你们都在自述文件的愿望清单上列出了“所有平台的自动化电子构建”。引入 CI 工作流程以确保至少可以在开发环境中从源代码构建项目是朝这个方向迈出的良好第一步。这里的许多基础工作都可以重新用于自动化测试平台和自动构建系统,两者都将使这个项目开放更多的贡献。

  4. 将所有lw.*包合并到一个 monorepo

    这个建议可能有点争议,但是考虑到这个项目有很多相关的包需要一前一后地改变,如果每个包都被签入,可能更容易跟踪项目的历史并协调跨领域的变化。相同的回购协议。这种方法适用于像 React 和 Babel 这样的项目,我想它在这里也适用。

    我不确定你们是否都熟悉Lerna,但它是一种减少管理多个包的单一仓库的摩擦的工具。

tl;博士

我无法从源代码构建,有一些问题导致了这一点,我对如何消除这些问题有一些建议,如果你们愿意接受这些建议,我很乐意采纳这些建议。感谢制作有用的软件!!

无法从源代码构建 #562

我刚刚在另一期中提到了这一点;我非常担心 laserweb 很容易成为废弃软件,除非我们能找到一种方法来针对相对快速移动的 npm 依赖链、浏览器要求、不断发展的 web 标准等来维护它。

第一个需要是进入你的方案中的步骤 2),并以此为契机尽可能地更新依赖项。例如,我希望这可以解决滚动条问题。我对此毫无用处,但我可以帮助完成第 3 步),因为我的职业是 CM/Build/Devops 工程师。

至关重要的是,如果我们能做到这一点,那么我们就可以考虑如何为新控制器扩展 Laserweb,并可能在响应速度更快的界面上工作。

无法从源代码构建 #562
成员

情况是,所有前端开发人员都离开了该项目。我是唯一剩下的开发人员,但我的部分是后端 (lw.comm-server)。我不太熟悉前端的 react/redux/webpack。如果有人可以帮助升级所有依赖项并将整个项目带到没有经验的开发人员也可以编译它的状态,我将非常高兴。

重要的是:

  • 前端 defs 使用分支“dev-es6”仅用于前端的开发和编译(webpack)。他们手动运行 lw.comm-server (nodejs start) 来测试它。
  • 后端是在 lw.comm-server (maser) 中开发的。
  • electron 安装程序内置于 lw.comm-server 的 electron_bundler 分支中。编译exe首先需要合并master分支的改动,然后将前端的webpack文件复制到app文件夹下编译exe。package.json 中有一些脚本可以做到这一点。
无法从源代码构建 #562
贡献者
容易成为攻击目标 评论了 2019 年 10 月 8 日  

@cprezzi; 谢谢你的回复,真的很感激能花时间解释一下:-)
如果我能解决一些眼前的问题(与工作相关),我会尝试获得一个分支机构。这将是一个好的开始。

我没有意识到涉及电子(对我来说是新手..)但我很容易让演示运行起来。

我希望这不是一个天真的问题;它的电子仅用于构建 Windows 可执行文件?

  • 我在这里完全使用 Linux,在我的笔记本电脑上使用 Fedora,在为我的 CNC 提供服务的 PI3 上将 lw.comm-server 作为 Raspian 上的服务。它对发展有多重要?
  • 我可以看到发布需要 electron 构建,但是没有它可以进行开发吗?
无法从源代码构建 #562

@awhitty; 您是否有机会考虑将一个合理/有效的 package.lock 放在一起;要么针对dev-es6分支,要么基于该分支启动另一个分支以实现某种综合发布,因此我们至少了解最新的依赖关系并且可以再次关注实际问题。

不是:我认为 laserweb 功能已完成供我使用。总会有一大堆可以改进的地方,但它目前非常适合我的工作流程。

无法从源代码构建 #562
成员
开胃菜 评论了 2019 年 10 月 8 日  

@easytarget您不需要 electron 分支进行开发。它仅在构建 Windows 和 OSX 可执行文件/安装程序时需要。

前端 (LaserWeb4) 和后端 (lw.comm-server) 理论上是独立的应用程序,仅通过 websockets 进行通信。

为方便起见,后端 nodejs 网络服务器还提供前端 webpack 文件。这意味着克隆 lw.comm-server 并运行“node server.js”就足够了,然后在 IP 端口 8000 上使用 chrome 或 chromium 浏览器访问前端(如 Raspberry Pi wiki 中所述)。

对于前端开发,你只需要 LaserWeb4/dev-es6。如果您还想测试服务器通信,请在测试前手动启动 lw.comm-server。

无法从源代码构建 #562
成员
开胃菜 评论了 2019 年 10 月 8 日  

我将 LaserWeb4 dev-es6 分支和 lw.comm-server master 带到了可以在 nodejs 10.16.3 下编译的状态。

为了让它工作,你必须:

  1. 克隆 lw.comm 服务器
  2. 运行npm install
  3. 测试是否node server.js有效。
  4. 克隆 LaserWeb4
  5. 运行npm run installdev
  6. 运行npm run start-app前端测试。这会编译 webpack 并在 localhost:8080/webpack-dev-server/ 上启动浏览器。(webpack 编译准备就绪需要一些时间!)

在前端更新了一些东西之后:

  • npm run bundle-dev在 LaserWeb4 文件夹中运行。这会在 dist 文件夹中创建 webpack 文件,然后可以将其复制到 lw.comm-server(嵌入式网站)的 app 文件夹中。您可以在 lw.comm-server 文件夹中运行脚本,而不是手动复制npm run update_lw4(需要 bash 控制台来执行 ncp 命令)。

我希望这至少能给你一个可以编译的起点!

无法从源代码构建 #562
合作者作者
哇哦 评论了 2019 年 10 月 9 日  

感谢您的答复@cprezzi@easytarget!额外的上下文非常有帮助。

我将查看您对两个存储库所做的更改,以更多地了解发生了什么,我将按照这些说明进行操作!我很高兴 PR 更改以引入package-lock.json并确定软件包的确切版本。我的目标是今晚做到这一点。我在太平洋时间,所以从现在起大约 11 或 12 小时。

我想到了其他一些事情,尽管这些主题大多与这个特定问题无关:

  • 对这些回购协议的贡献有什么特别的结构吗?我认为具有批准审查的 PR 就足够了。
  • 是否有关于如何对存储库进行版本控制以及如何发布的政策?
  • 是否有我们可以修饰的路线图或积压的功能?我看到一些可能有意义的 Github 问题作为起点,并且@easytarget提到了对更多控制器和 UI 调整的支持。
无法从源代码构建 #562
成员
  • 对于贡献,我认为带有批准评论的 PR 是一个很好的解决方案
  • 对于发布:他们与过去负责发布工作的开发人员一起使用;)
  • 对于路线图:我认为 github 问题是一个很好的起点。
  • 对于支持的控制器:我认为我们已经支持最常见的控制器。到目前为止,我尝试将控制器与前端分离并处理后端的差异(如果可能)。唯一的例外是“marlin gcode 编译器”,它更容易在前端实现。
无法从源代码构建 #562
合作者作者

@cprezzi谢谢回答我的问题!

那我给你分配PR。

关于路线图,我认为我们应该梳理一下 GH 问题并寻找一些共同的主题。一旦我们获得一致的构建工作(我认为#573让我们到达那里),就该对功能工作进行优先排序,并且这种优先排序可以告知哪些其他类型的技术债务值得早日解决,哪些更晚。

关于控制器支持,这是有道理的。我还不熟悉 marlin 与 grbl 的不同之处或其他东西,但我相信这个判断?

无法从源代码构建 #562
成员
开胃菜 评论了 2019 年 10 月 11 日  

@awhitty我已邀请您成为 LaserWeb 组织的管理员,这样您就可以在我们所有的回购协议中执行所需的操作;)

无法从源代码构建 #562
合作者作者

@cprezzi顺便说一句,这并没有从我的雷达上消失!刚从一个长假回来,所以我正在慢慢收拾东西。

无法从源代码构建 #562
米法德尔85 评论了 2020 年 4 月 17 日  

我无法使用 ubuntu、19.10、节点 v13.13.0 构建应用程序,
在执行时
node src/index.js
我得到这个
`(节点:11762)实验警告:ESM 模块加载器是实验性的。
file:///home/mfadel/Projects/LaserWeb4-dev-es6/src/index.js:63
返回;
^

SyntaxError:
Loader.moduleStrategy (internal/modules/esm/translators.js:81:18)
在异步链接 (internal/modules/esm/module_job.js:37:21)处出现意外标记“<”
`

我通过执行 npm install 尝试了另一种方法

执行时
npm install

`> serialport@6.2.2 安装/home/mfadel/Projects/LaserWeb4-dev-es6/node_modules/lw.comm-server/node_modules/serialport

预构建安装 || 节点石膏重建

prebuild-install WARN install No prebuilt binaries found (target=13.13.0 runtime=node arch=x64 platform=linux)
make: 进入目录 ‘/home/mfadel/Projects/LaserWeb4-dev-es6/node_modules/lw.comm-server /node_modules/serialport/build’
CXX(target) Release/obj.target/serialport/src/serialport.o
在 ../src/./serialport.h:6 包含的文件中,
来自 ../src/serialport.cpp :1:
../../../../nan/nan.h: 在函数 ‘void Nan::AsyncQueueWorker(Nan::AsyncWorker*)’ 中:
../../../../ nan/nan.h:2298:62: 警告:在从’void ( )(uv_work_t )’ {aka ‘void ( )(uv_work_s )’} 到 ‘uv_after_work_cb’ {aka ‘void ( )(uv_work_s , int)’} [-Wcast 函数类型]
2298| , 重新解释_cast<uv_after_work_cb>(AsyncExecuteComplete)
| ^
../src/serialport.cpp: 在函数 ‘Nan::NAN_METHOD_RETURN_TYPE Open(Nan::NAN_METHOD_ARGS_TYPE)’:
../src/serialport.cpp:41:48: error: no matching function for call to ‘v8: :Value::ToString()’
41 | v8::String::Utf8Value 路径(信息[0]->ToString());
| ^
在 /home/mfadel/.cache/node-gyp/13.13.0/include/node/node.h:67 包含的文件中,
来自 ../../../../nan/nan.h: 54,
来自../src/./serialport.h:6,
来自../src/serialport.cpp:1:
/home/mfadel/.cache/node-gyp/13.13.0/include/node/v8.h:2750:44: 注意:候选:’v8::MaybeLocalv8::String v8::Value::ToString(v8: :Localv8::上下文) const’
2750 | V8_WARN_UNUSED_RESULT MaybeLocal ToString(
| ^~~~~~~~
/home/mfadel/.cache/node-gyp/13.13.0/include/node/v8.h:2750:44: 注意:候选人需要 1 个参数,提供 0 个参数
../src/serialport.cpp:48:53: 错误:没有匹配函数来调用 ‘v8::Value::ToObject()’
48 | v8::Localv8::Object options = info[1]->ToObject ();
| ^
在 /home/mfadel/.cache/node-gyp/13.13.0/include/node/node.h:67 包含的文件中,
来自 ../../../../nan/ nan.h:54,
来自 ../src/./serialport.h:6,
来自 ../src/serialport.cpp:1:/home/mfadel/.cache/node-gyp/13.13.0/include/node/v8.h:2754:44
: 注意:候选:’v8::MaybeLocalv8: :Object v8::Value::ToObject(v8::Localv8::Context) 常量’
2754 | V8_WARN_UNUSED_RESULT MaybeLocal ToObject(
| ^~~~~~~~
/home/mfadel/.cache/node-gyp/13.13.0/include/node/v8.h:2754:44: 注意:候选人需要 1 个参数,提供 0 个参数
../src/serialport.cpp:78:69: 警告:从’void ( )(uv_work_t )'{又名’void( )(uv_work_s )’}到’uv_after_work_cb'{又名’void( ) ‘之间的不兼容函数类型之间进行转换(uv_work_s , int)’} [-Wcast 函数类型]
78 | ueue_work(uv_default_loop(), req, EIO_Open, (uv_after_work_cb)EIO_AfterOpen);
| ^~~~~~~~~~~~~

../src/serialport.cpp: 在函数 ‘void EIO_AfterOpen(uv_work_t*)’ 中: ../src/serialport.cpp:95:
30: 警告:’v8::Localv8::Value Nan::Callback::Call (int, v8::Localv8::Value ) const’ 已弃用 [-Wdeprecated-declarations]
95 | 数据->callback.Call(2, argv);
| ^
在包含自 ../src/./serialport.h:6 的文件中,
来自 ../src/serialport.cpp:1:
../../../../nan/nan.h:1740: 3:注意:这里声明
1740 | 调用(int argc, v8::Localv8::Value argv[]) const {
| ^~~~
../src/serialport.cpp: In function ‘Nan::NAN_METHOD_RETURN_TYPE Update(Nan::NAN_METHOD_ARGS_TYPE)’:
../src/serialport.cpp:113:53: error: 没有匹配的调用函数’v8::Value::ToObject()’
113 | v8::Localv8::Object options = info[1]->ToObject();
| ^
在 /home/mfadel/.cache/node-gyp/13.13.0/include/node/node.h:67 包含的文件中,
来自 ../../../../nan/nan.h: 54,
来自../src/./serialport.h:6,
来自
../src/serialport.cpp:1:/home/mfadel/.cache/node-gyp/13.13.0/include/node/v8。 h:2754:44: 注意:候选:’v8::MaybeLocalv8::Object v8::Value::ToObject(v8::Localv8::Context) const’
2754 | V8_WARN_UNUSED_RESULT MaybeLocal ToObject(
| ^~~~~~~~
/home/mfadel/.cache/node-gyp/13.13.0/include/node/v8.h:2754:44: 注意:候选人需要 1 个参数,提供 0 个参数
../src/serialport.cpp:135:71: 警告:在从’void ()(uv_work_t*)’ {aka ‘void ( )(uv_work_s )’} 到 ‘uv_after_work_cb’ {aka ‘void ( )(uv_work_s , int)’} [-Wcast 函数类型]
135 | _work(uv_default_loop(), req, EIO_Update, (uv_after_work_cb)EIO_AfterUpdate);
| ^~~~~~~~~~~~~~~

../src/serialport.cpp: 在函数 ‘void EIO_AfterUpdate(uv_work_t*)’ 中: ../src/serialport.cpp:150:
30: warning: ‘v8::Localv8::Value Nan::Callback::Call (int, v8::Localv8::Value ) const’ 已弃用 [-Wdeprecated-declarations]
150 | 数据->callback.Call(1, argv);
| ^
在包含自 ../src/./serialport.h:6 的文件中,
来自 ../src/serialport.cpp:1:
../../../../nan/nan.h:1740: 3:注意:这里声明
1740 | 调用(int argc, v8::Localv8::Value argv[]) const {
| ^~~~
../src/serialport.cpp: In function ‘Nan::NAN_METHOD_RETURN_TYPE Close(Nan::NAN_METHOD_ARGS_TYPE)’:
../src/serialport.cpp:175:70: 警告:在不兼容的函数类型之间进行转换’空白 (
)(uv_work_t*)’ {aka ‘void ( )(uv_work_s )’} 到 ‘uv_after_work_cb’ {aka ‘void ( )(uv_work_s , int)’} [-Wcast-function-type]
175 | ue_work(uv_default_loop(), req, EIO_Close, (uv_after_work_cb)EIO_AfterClose);
| ^~~~~~~~~~~~~~

../src/serialport.cpp: 在函数 ‘void EIO_AfterClose(uv_work_t*)’ 中: ../src/serialport.cpp:188:
30: 警告:’v8::Localv8::Value Nan::Callback::Call (int, v8::Localv8::Value ) const’ 已弃用 [-Wdeprecated-declarations]
188 | 数据->callback.Call(1, argv);
| ^
在包含自 ../src/./serialport.h:6 的文件中,
来自 ../src/serialport.cpp:1:
../../../../nan/nan.h:1740: 3:注意:这里声明
1740 | 调用(int argc, v8::Localv8::Value argv[]) const {
| ^~~~
../src/serialport.cpp: In function ‘Nan::NAN_METHOD_RETURN_TYPE Flush(Nan::NAN_METHOD_ARGS_TYPE)’:
../src/serialport.cpp:215:70: 警告:在不兼容的函数类型之间进行转换’空白 (
)(uv_work_t*)’ {aka ‘void ( )(uv_work_s )’} 到 ‘uv_after_work_cb’ {aka ‘void ( )(uv_work_s , int)’} [-Wcast-function-type]
215 | ue_work(uv_default_loop(), req, EIO_Flush, (uv_after_work_cb)EIO_AfterFlush);
| ^~~~~~~~~~~~~~

../src/serialport.cpp: In function ‘void EIO_AfterFlush(uv_work_t*)’:
../src/serialport.cpp:231:30: warning: ‘v8::Localv8::Value Nan::Callback::Call(int, v8::Localv8::Value) const’ is deprecated [-Wdeprecated-

喜欢 (0)