txthinking / nami

A clean and tidy decentralized package manager.
https://www.txthinking.com
GNU General Public License v3.0
317 stars 31 forks source link

Why use deno? #16

Closed FirYuen closed 2 years ago

FirYuen commented 2 years ago

你好, 去年曾经关注过这个项目,之前使用时是nami加上远程文件夹中的json配置文件,想请教为什么现在要改用内置一个deno,同时需要编写deno的js脚本去进行下载操作呢?内嵌deno不仅导致nami的可执行文件体积暴增,deno的js编写也没有似乎也简化创建软件包的过程

txthinking-bot commented 2 years ago

其实是一个主动和被动的问题。

包作者主动:之前是要求包的作者按照nami指定的命名格式去命名,很显然众多的包的作者是否愿意去主动适配nami是一个问题

包作者被动:被动的话,包的作者们就无需关心nami的存在,让nami仓库的js维护者来去任意的地方去下载包

这其实是一个包作者和包维护者的问题,似乎打破不了这个模式。比如debian和brew,存在一个可能安装过时的包,当然nami的js就从作者官方下载地址直接下载最新的版本

另外就是js写起来也心智负担比较低(个人主观认为)比较方便,比如从各种tar, zip里解压,甚至下载配置文件比如vim.txthinking.js by unknown

FirYuen commented 2 years ago

其实关于包维护的问题我可以理解,但是我的疑问是: 既然选择了使用go那么是否本身就应该使用go 去进行 配置文件的解析,可执行文件的下载,解压释放等操作,而不是在go中嵌入一个deno,然后用deno去解析js文件并进行下载,解压等操作.

从另一个角度来说,那些js中已经写出了文件的完整下载路径,某种意义上来将此时我甚至不需要deno,只需要写一个简单的shell脚本就能做到下载,安装等操作

整体目前的nami给我的感觉是"诡异",我更加喜欢以前的nami,直接去访问远程的json读取配置进行解析下载.nami本身也非常轻量,只有不到10M,而不是像现在体积快到100M...

txthinking-bot commented 2 years ago

一个包是一个专有语法的配置文件 或 是一个js文件。debian采用前者,brew采用后者ruby脚本。

因为windows即使是git bash,兼容性仍是大问题,灵活性也差点。再就是bash和js虽然都是胶水语言,但bash如果写的复杂未来的可读性会差。

包大小问题,是的需要一个js runtime。

把包大小脱离nami单独拿出来说的话,网络和硬盘应该不算是大问题。另外npm下边有很多有用的CLI工具,有两种运行方式,安装nodejs和npm和npx,这样会在多个目录下写文件,还有一种运行方式是binary,当然会很大,但只有一个文件,个人更倾向于后者 by unknown

txthinking-bot commented 2 years ago

之前的远程访问json,解决不了让包作者主动的问题。 额外的github release下载文件是一个特殊处理,强制release文件的按照xxx_xxx_xxx格式就命名,但现实是差异太大,各种命名格式都有,还有各种压缩包 by unknown

txthinking-bot commented 2 years ago

在比如这个文件https://github.com/txthinking/nami/blob/master/package/brook.js 实现了升级brook后会恢复之前运行中的brook命令 by unknown

FirYuen commented 2 years ago

我理解到了您的想法了. 我之前的使用场景是自己维护了一个对象存储,将自己编译出的可执行文件上传到了服务器当中,所以nami十分好用. 但是这是类似debian的配置文件的做法,由维护者去维护线上的软件版本. 您目前的做法是采用brew的做法,使用了一个runtime去执行脚本,因为要解决软件作者可能没有按照格式进行发布的问题.

我还是很怀念之前的nami,功能好用,十分十分符合我当时的需求,并且我没有找到类似的软件. 但是现在的模式我好像找到了几个类似的,专门从github release去下载安装的包管理器,比如: stew,indiepkg,afk

再说一句..其实目前nami比较让我觉得难受的还是可执行的文件的大小,deno实在太大了,在部分家庭网络环境中从github release下载会遇到劫持等问题,并且下载速度会十分不理想.

ps: 最近看到您添加了tengo,请问后续有计划转为使用tengo的runtime吗?

txthinking-bot commented 2 years ago

嗯,brook MITM里支持tengo ,还需要观察下。

我好像想到了一个让nami支持 你的使用场景 的方式,过两天有空了我先落地实践一下 by unknown

FirYuen commented 2 years ago

十分感谢您的辛勤工作和认真解答!

txthinking commented 2 years ago

https://github.com/txthinking/nami/blob/master/package/readme.md

维护自己的包的方式,核心就是脚本把命令文件放到 $HOME/.nami/cache/ 目录下即可

比如:

cat brook.tengo

name := "brook"

config := {
  "brook_linux_amd64": "https://github.com/txthinking/brook/releases/latest/download/brook_linux_amd64",
  "brook_darwin_amd64": "https://github.com/txthinking/brook/releases/latest/download/brook_darwin_amd64",
  "brook_darwin_arm64": "https://github.com/txthinking/brook/releases/latest/download/brook_darwin_arm64",
  "brook_windows_amd64.exe": "https://github.com/txthinking/brook/releases/latest/download/brook_windows_amd64.exe"
}

/////下面的基本不需要改,非基本可以自己稍微改改,核心就是脚本把命令文件放到HOME/.nami/cache/目录下///

os := import("os")
fmt := import("fmt")
text := import("text")
nami := import("nami")

nami.sh("curl", "-L", "--progress-bar", config[name + "_" + nami.os + "_" + nami.arch + (nami.os == "windows" ? ".exe" : "")], "-o", text.join([nami.cache_dir, name + (nami.os == "windows" ? ".exe" : "")], os.path_separator))

可以放到本地

nami install ./brook.tengo

可以讲这个brook.tengo放到自己的http server,就可以

nami install https://yourserver.com/brook.tengo

也可以动态的输出脚本, 比如借助 https://deno.com/deploy 省了自己的服务器

import httpserver from 'https://raw.githubusercontent.com/txthinking/denolib/master/httpserver.js';

function get_tengo_script(name){
  return `
name := "${name}" // the package name you are installing, or dynamic get from URL path with your custom server

config := {
  "brook_linux_amd64": "https://github.com/txthinking/brook/releases/latest/download/brook_linux_amd64",
  "brook_darwin_amd64": "https://github.com/txthinking/brook/releases/latest/download/brook_darwin_amd64",
  "brook_darwin_arm64": "https://github.com/txthinking/brook/releases/latest/download/brook_darwin_arm64",
  "brook_windows_amd64.exe": "https://github.com/txthinking/brook/releases/latest/download/brook_windows_amd64.exe",
  "httpserver_linux_amd64": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_linux_amd64",
  "httpserver_darwin_amd64": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_darwin_amd64",
  "httpserver_darwin_arm64": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_darwin_arm64",
  "httpserver_windows_amd64.exe": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_windows_amd64.exe"
}

////下面的基本不需要改,非基本可以自己稍微改改,核心就是脚本把命令文件放到HOME/.nami/cache/目录下//////

os := import("os")
fmt := import("fmt")
text := import("text")
nami := import("nami")

nami.sh("curl", "-L", "--progress-bar", config[name + "_" + nami.os + "_" + nami.arch + (nami.os == "windows" ? ".exe" : "")], "-o", text.join([nami.cache_dir, name + (nami.os == "windows" ? ".exe" : "")], os.path_separator))
`;
}

httpserver.path('/brook.tengo', async (r)=>new Response(get_tengo_script("brook")))
httpserver.path('/httpserver.tengo', async (r)=>new Response(get_tengo_script("httpserver")))

httpserver.run({port:8080});

就可以这样

nami install https://XXX.deno.dev/brook.tengo
nami install https://XXX.deno.dev/httpserver.tengo
FirYuen commented 2 years ago

import httpserver from 'https://raw.githubusercontent.com/txthinking/denolib/master/httpserver.js';

function get_tengo_script(name){ return ` name := "${name}" // the package name you are installing, or dynamic get from URL path with your custom server

config := { "brook_linux_amd64": "https://github.com/txthinking/brook/releases/latest/download/brook_linux_amd64", "brook_darwin_amd64": "https://github.com/txthinking/brook/releases/latest/download/brook_darwin_amd64", "brook_darwin_arm64": "https://github.com/txthinking/brook/releases/latest/download/brook_darwin_arm64", "brook_windows_amd64.exe": "https://github.com/txthinking/brook/releases/latest/download/brook_windows_amd64.exe", "httpserver_linux_amd64": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_linux_amd64", "httpserver_darwin_amd64": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_darwin_amd64", "httpserver_darwin_arm64": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_darwin_arm64", "httpserver_windows_amd64.exe": "https://github.com/txthinking/httpserver/releases/latest/download/httpserver_windows_amd64.exe" }

////下面的基本不需要改,非基本可以自己稍微改改,核心就是脚本把命令文件放到HOME/.nami/cache/目录下//////

os := import("os") fmt := import("fmt") text := import("text") nami := import("nami")

nami.sh("curl", "-L", "--progress-bar", config[name + "" + nami.os + "" + nami.arch + (nami.os == "windows" ? ".exe" : "")], "-o", text.join([nami.cache_dir, name + (nami.os == "windows" ? ".exe" : "")], os.path_separator)) `; }

httpserver.path('/brook.tengo', async (r)=>new Response(get_tengo_script("brook"))) httpserver.path('/httpserver.tengo', async (r)=>new Response(get_tengo_script("httpserver")))

httpserver.run({port:8080});

十分感谢! 经过测试完全可以满足我需求了!

txthinking-bot commented 2 years ago

/httpserver by SNOOK78

m2acgi commented 1 year ago

建议采用这种方式 https://github.com/izirku/gitrel, 不需要包作者适配任何东西,也不要 nami仓库维护者,直接从 github 安装任何二进行文件,但是这个项目停止更新了,最后一个 release 也不兼容最新的主流 linux 发行版。