Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: enable_external_cores #765

Closed
wants to merge 5 commits into from
Closed

Conversation

Itsusinn
Copy link

Allow users use system-wide binaries

@greenhat616
Copy link
Collaborator

如果可以的话,可以考虑将 sidecar 拆出来。将四种内核做成可选下载的模式,然后在这个子模块里实现进程管理(包括退出杀死进程)

@Itsusinn
Copy link
Author

将四种内核做成可选下载的模式

我更倾向与使用包管理器管理内核

@Itsusinn
Copy link
Author

如果可以的话,可以考虑将 sidecar 拆出来。

能否更详尽的解释一下呢

@Itsusinn
Copy link
Author

Itsusinn commented Apr 14, 2024

其实我本来的想法是提供一个文本输入框,允许输入自定义命令,奈何我对前端不是很熟悉,写不出来

@greenhat616
Copy link
Collaborator

如果可以的话,可以考虑将 sidecar 拆出来。

能否更详尽的解释一下呢

Tauri v1 的 sidecar 除了提供打包支持外,还内嵌了进程管理功能(通过 Drop trait 担保了在退出程序时会清理 Clash 进程)。通过 Command 自行管理的时候,需要自行实现一个 Guard 来保证不会成为孤儿进程(这个应该丢给 AppCtx 比较合适,但是 Verge 时期并没有做这个事情,全是通过 OnceCell 实现的 Singleton,因此只能继续这么做了)。

因为内嵌四个内核导致安装包过于庞大,所以我们内部有讨论过:在未来修改内核的引入方式,变成可选内核的模式,这样可以大幅减小安装包大小。

我们需要将目录拆分成配置目录和数据目录,数据目录用来保存 storage、内核、geoip、geosite 等文件。

https://docs.rs/tauri/1.6.1/tauri/api/path/fn.data_dir.html

目前计划的是遵循 Tauri 的建议,将数据目录定在 $DATA_DIR/clash-nyanpasu{-dev} 下。

综上,目前如果要做成以上想法的实现的话,需要:
1、拆分数据目录、配置目录,更新现有的 migration 逻辑,实现对用户的无感迁移
2、做一个进程管理 Guard,避免孤儿问题(这个比较必要);同时可能需要修改服务模式的代码,实现兼容。

将四种内核做成可选下载的模式

我更倾向与使用包管理器管理内核

这个显然不现实,除了 Linux,其他发行版都没有集成合适的包管理器,所以内置内核还是比较合适的。

Windows 11下预装了 winget,但是直到现有的 Pre-release 才支持设置 Proxy;Scoop、Chocolatey 需要自行安装;
macOS 下比较常用的 Homebrew 也是需要自己安装的。

其实我本来的想法是提供一个文本输入框,允许输入自定义命令,奈何我对前端不是很熟悉,写不出来

这样作用不大。不如支持自定义 PATH。我没有深度研究过 Command,如果 Command 支持自定义 PATH 的话,通过在前端添加自定义 PATH 数组的功能可以最大限度实现外部 binary 的支持。

@Itsusinn
Copy link
Author

Tauri v1 的 sidecar 除了提供打包支持外,还内嵌了进程管理功能(通过 Drop trait 担保了在退出程序时会清理 Clash 进程)。

所以实际上tauri的Command::newCommand::new_sidecar不仅仅是二进制查找路径的不同,后者还附带提供了进程管理功能而前者没有?

因为内嵌四个内核导致安装包过于庞大,所以我们内部有讨论过:在未来修改内核的引入方式,变成可选内核的模式,这样可以大幅减小安装包大小。

这不是本pr的目的,本pr更倾向与保留内嵌内核

我更倾向与使用包管理器管理内核

这个显然不现实,除了 Linux,其他发行版都没有集成合适的包管理器,所以内置内核还是比较合适的。

Same as above. 本pr的用例是这样的: 包管理器(或cargo install)安装的二进制往往更定制化,比如使用更多cpu指令集,启用或不启用某些feature等等,让nyan使用它们便是本pr的目的

其实我本来的想法是提供一个文本输入框,允许输入自定义命令,奈何我对前端不是很熟悉,写不出来

这样作用不大。不如支持自定义 PATH。我没有深度研究过 Command,如果 Command 支持自定义 PATH 的话,通过在前端添加自定义 PATH 数组的功能可以最大限度实现外部 binary 的支持。

自定义PATH确实更合理些,不过这里自定义命令的主要的原因是二进制名可能不是nyan假定的那样,比如:clash-meta可能不是mihomo, clash-rs的二进制可能不是clash-rs等等

@greenhat616
Copy link
Collaborator

所以实际上tauri的Command::new和Command::new_sidecar不仅仅是二进制查找路径的不同,后者还附带提供了进程管理功能而前者没有?

是的,v2 没研究怎么处理的,但是 v1 是附带了的。
最早是直接 Drop 中清理的:tauri-apps/tauri@85d815c
目前抽了个方法出来:https://github.com/tauri-apps/tauri/blob/aeddc40b9e461bc118382ae62431d39e29f25915/core/tauri/src/app.rs#L536-L548

其他问题可以留到以后解决,但是进程清理是有必要的。

自定义PATH确实更合理些,不过这里自定义命令的主要的原因是二进制名可能不是nyan假定的那样,比如:clash-meta可能不是mihomo, clash-rs的二进制可能不是clash-rs等等

Nyanpasu 内部通过枚举标记不同内核,所以我们需要探寻一种方法来标记内核。或许通过版本信息区分是个好方法?不过得通过 .or 依次尝试 -v-V 了。
image

@keiko233 keiko233 force-pushed the main branch 2 times, most recently from b93b368 to af8d75c Compare April 23, 2024 07:22
@keiko233 keiko233 force-pushed the main branch 7 times, most recently from ef6fbe5 to b064023 Compare May 24, 2024 05:53
@Itsusinn Itsusinn closed this Jun 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants