如何使用Go语言实现Deno升级功能?

2026-04-01 22:191阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1193个文字,预计阅读时间需要5分钟。

如何使用Go语言实现Deno升级功能?

使用`upgrade`命令后,用Go语言实现了自己的`upgrade`命令。获取最新版本,我们首先查看Deno的源代码:`use deno_runtime:deno_fetch: reqwest: Client; const RELEASE_URL: str=https://github.com/denoland/deno/releases.;`

upgrade 命令后使用 Go 语言实现了自己的 upgrade 命令。

获取最新版本

我们先来看下 Deno 的源码:

use deno_runtime::deno_fetch::reqwest::Client; const RELEASE_URL: &str = "github.com/denoland/deno/releases"; ... async fn get_latest_release_version( client: &Client, ) -> Result<String, AnyError> { println!("Looking up latest version"); let res = client .get(&format!("{}/latest", RELEASE_URL)) .send() .await?; let version = res.url().path_segments().unwrap().last().unwrap(); Ok(version.replace("v", "")) }

  • 分析出以上代码做了以下几件事:由于是异步函数,用 println 函数提示正在查找新版本使用 GET 方式请求 github.com/denoland/deno/releases/latest
  • github.com/denoland/deno/releases/latest 会重定向到最新的 release github.com/denoland/deno/releases/tag/v1.7.1,通过一顿字符串操作我们便取出了 v1.7.1

  • 调用字符串的 replace 方法替换 v"" 得到版本号
  • 让我们用 Go 来实现它:

    代码看起来差不多,比如模板字符串写法、字符串处理

    package release import ( "net/github.com/%s/%s/releases/latest", user, repo) resp, _ := github.com/%s/%s/releases/latest", user, repo) resp, err := raw.githubusercontent.com/youngjuning/tpc/main/install.sh | sh").Run() } else { fmt.Printf("Local version %v is the most recent release \n", current) } } var rootCmd = &cobra.Command{ Use: "app", Version: Version, } var cmdUpgrade = &cobra.Command{ Use: "upgrade", Run: func(cmd *cobra.Command, args []string) { checkUpgrade(Version, force) }, } func main() { rootCmd.AddCommand(cmdUpgrade) rootCmd.Execute() }强制更新方案

    Node.js 命令行工具检查更新的正确姿势 对这个问题做了很深入的研究并实现了 Node 版的工具。核心逻辑就是每次执行命令时异步去执行检查更新。这句话翻译成 Go 就是用协程去执行检查更新的动作,这样执行命令还是会立马得到反馈,程序则会在后台执行检查更新,当检测到有新版本则强制更新。

    完整代码在go-release/example,对 Cobra 不熟悉的同学可以看一下 Cobra 中文文档。

    执行 shell 命令推荐 go-sh,它对 exec 包做了封装,提供了更好地使用体验( PS:还不是因为我菜)

    // rootCmd 代表没有调用子命令时的基础命令 var rootCmd = &cobra.Command{ Use: "tpc", Version: Version, Run: func(cmd *cobra.Command, args []string) { sh.Command("tpc", "-h").Run() }, // 每次执行完命令后去执行检查更新,Start 表示不阻塞原来的任务,还有一个 Run 方法则是会阻塞 PersistentPostRun: func(cmd *cobra.Command, args []string) { sh.Command("bash", "-c", "tpc upgrade --force=false").Start() }, }go-release 的诞生

    go-release 核心代码翻译自 Deno 的 upgrade,开源项目,点赞是我维护的动力,在此求个 Star。

如何使用Go语言实现Deno升级功能?

本文共计1193个文字,预计阅读时间需要5分钟。

如何使用Go语言实现Deno升级功能?

使用`upgrade`命令后,用Go语言实现了自己的`upgrade`命令。获取最新版本,我们首先查看Deno的源代码:`use deno_runtime:deno_fetch: reqwest: Client; const RELEASE_URL: str=https://github.com/denoland/deno/releases.;`

upgrade 命令后使用 Go 语言实现了自己的 upgrade 命令。

获取最新版本

我们先来看下 Deno 的源码:

use deno_runtime::deno_fetch::reqwest::Client; const RELEASE_URL: &str = "github.com/denoland/deno/releases"; ... async fn get_latest_release_version( client: &Client, ) -> Result<String, AnyError> { println!("Looking up latest version"); let res = client .get(&format!("{}/latest", RELEASE_URL)) .send() .await?; let version = res.url().path_segments().unwrap().last().unwrap(); Ok(version.replace("v", "")) }

  • 分析出以上代码做了以下几件事:由于是异步函数,用 println 函数提示正在查找新版本使用 GET 方式请求 github.com/denoland/deno/releases/latest
  • github.com/denoland/deno/releases/latest 会重定向到最新的 release github.com/denoland/deno/releases/tag/v1.7.1,通过一顿字符串操作我们便取出了 v1.7.1

  • 调用字符串的 replace 方法替换 v"" 得到版本号
  • 让我们用 Go 来实现它:

    代码看起来差不多,比如模板字符串写法、字符串处理

    package release import ( "net/github.com/%s/%s/releases/latest", user, repo) resp, _ := github.com/%s/%s/releases/latest", user, repo) resp, err := raw.githubusercontent.com/youngjuning/tpc/main/install.sh | sh").Run() } else { fmt.Printf("Local version %v is the most recent release \n", current) } } var rootCmd = &cobra.Command{ Use: "app", Version: Version, } var cmdUpgrade = &cobra.Command{ Use: "upgrade", Run: func(cmd *cobra.Command, args []string) { checkUpgrade(Version, force) }, } func main() { rootCmd.AddCommand(cmdUpgrade) rootCmd.Execute() }强制更新方案

    Node.js 命令行工具检查更新的正确姿势 对这个问题做了很深入的研究并实现了 Node 版的工具。核心逻辑就是每次执行命令时异步去执行检查更新。这句话翻译成 Go 就是用协程去执行检查更新的动作,这样执行命令还是会立马得到反馈,程序则会在后台执行检查更新,当检测到有新版本则强制更新。

    完整代码在go-release/example,对 Cobra 不熟悉的同学可以看一下 Cobra 中文文档。

    执行 shell 命令推荐 go-sh,它对 exec 包做了封装,提供了更好地使用体验( PS:还不是因为我菜)

    // rootCmd 代表没有调用子命令时的基础命令 var rootCmd = &cobra.Command{ Use: "tpc", Version: Version, Run: func(cmd *cobra.Command, args []string) { sh.Command("tpc", "-h").Run() }, // 每次执行完命令后去执行检查更新,Start 表示不阻塞原来的任务,还有一个 Run 方法则是会阻塞 PersistentPostRun: func(cmd *cobra.Command, args []string) { sh.Command("bash", "-c", "tpc upgrade --force=false").Start() }, }go-release 的诞生

    go-release 核心代码翻译自 Deno 的 upgrade,开源项目,点赞是我维护的动力,在此求个 Star。

如何使用Go语言实现Deno升级功能?