Inhaltsverzeichnis
版本检测" >版本检测
cobra 实现 upgrade" >cobra 实现 upgrade
强制更新方案" >强制更新方案
Heim Backend-Entwicklung Golang Implementieren Sie ein Deno-Upgrade basierend auf Go

Implementieren Sie ein Deno-Upgrade basierend auf Go

Jul 24, 2023 pm 03:12 PM
go deno upgrade

Nach dem Upgrade-Befehl habe ich meinen eigenen Upgrade-Befehl mithilfe der Go-Sprache implementiert.

Holen Sie sich die neueste Version

Schauen wir uns zuerst den Quellcode von Deno an:

use deno_runtime::deno_fetch::reqwest::Client;
const RELEASE_URL: &str = "https://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", ""))
}
Nach dem Login kopieren
  • Analysieren Sie den obigen Code, um Folgendes zu tun: Da es sich um eine asynchrone Funktion handelt, verwenden Sie die println-Funktion, um dies anzufordern Sie suchen nach einer neuen Version und verwenden die GET-Methodenanfrage https://github.com/denoland/deno/releases/latest
  • https://github.com/denoland/deno/releases/latest wird zur weitergeleitet neueste Version https://github.com/denoland/deno/releases/tag/v1.7.1, durch eine String-Operation haben wir den ""</ Code> Versionsnummer abrufen</section ><code style="padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(145, 109, 213);font-weight: bolder;background-image: none;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;">replace 方法替换 v"" 得到版本号

  • 让我们用 Go 来实现它:

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

    package release
    
    import (
     "net/http"
     "strings"
    )
    
    func getLatestVersion() string{
     releaseURL := fmt.Sprintf("https://github.com/%s/%s/releases/latest", user, repo)
     resp, _ := http.Get(releaseURL)
     defer resp.Body.Close() // 为了防止内存泄漏
    
     pathArr := strings.Split(resp.Request.URL.Path, "/")
     latest := strings.Replace(pathArr[len(pathArr)-1], "v", "", 1)
     return latest
    }
    Nach dem Login kopieren

    版本检测

    版本的处理少不了SemVer。我们使用 go-version 来处理版本相关工作,有了版本比较我们便可以实现一个版本检查的功能。以下代码是 我封装的 go-release 中的一段代码:

    type UpdateInfo struct {
     IsUpdate      bool
     LatestVersion string
    }
    
    func CheckUpdate(user string, repo string, current string) (updateInfo *UpdateInfo, err error) {
     releaseURL := fmt.Sprintf("https://github.com/%s/%s/releases/latest", user, repo)
     resp, err := http.Get(releaseURL)
     if err != nil {
      return nil, err
     }
     defer resp.Body.Close()
    
     current = strings.Replace(current, "v", "", 1)
     pathArr := strings.Split(resp.Request.URL.Path, "/")
     latest := strings.Replace(pathArr[len(pathArr)-1], "v", "", 1)
    
     currentVersion, err := version.NewVersion(current)
     if err != nil {
      return nil, err
     }
     latestVersion, err := version.NewVersion(latest)
     if err != nil {
      return nil, err
     }
     updateInfo = &UpdateInfo{
      IsUpdate:      currentVersion.LessThan(latestVersion),
      LatestVersion: latest,
     }
     return updateInfo, nil
    }
    Nach dem Login kopieren

    cobra 实现 upgrade

    下面的代码中,我们基于 go-release 实现了一个带 upgrade

    Lassen Sie es uns in Go implementieren:

    Die Codes sehen ähnlich aus, z. B. das Schreiben von Vorlagenzeichenfolgen und die Zeichenfolgenverarbeitung🎜

    const Version = "0.0.1"
    
    func checkUpgrade(current string) {
      fmt.Println("Looking up latest version")
     update, err := release.CheckUpdate("youngjuning", "tpc", current)
     if err != nil {
      panic(err)
     }
     if update.IsUpdate {
      fmt.Printf("Found latest version %v \n", update.LatestVersion)
      sh.Command("bash", "-c", "curl -fsSL https://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()
    }
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜🎜🎜🎜Versionserkennung🎜🎜

    Version Die Verarbeitung von SemVer ist unverzichtbar. Wir verwenden go-version, um versionierte Arbeiten abzuwickeln. Mit dem Versionsvergleich können wir eine Versionsprüffunktion implementieren. Der folgende Code ist ein Teil meines gepackten Go-Release: 🎜

    // 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()
     },
    }
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜🎜🎜🎜cobra implementiert upgrade🎜🎜

    Im folgenden Code implementieren wir einen upgrade Befehls einfache CLI, die Kernlogik besteht darin, zu vergleichen, ob die lokale Version die neueste ist, und wenn nicht, die neueste zu installieren. 🎜

    const Version = "0.0.1"
    
    func checkUpgrade(current string) {
      fmt.Println("Looking up latest version")
     update, err := release.CheckUpdate("youngjuning", "tpc", current)
     if err != nil {
      panic(err)
     }
     if update.IsUpdate {
      fmt.Printf("Found latest version %v \n", update.LatestVersion)
      sh.Command("bash", "-c", "curl -fsSL https://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()
    }
    Nach dem Login kopieren
    Nach dem Login kopieren

    强制更新方案

    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()
     },
    }
    Nach dem Login kopieren
    Nach dem Login kopieren

    go-release 的诞生

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

Das obige ist der detaillierte Inhalt vonImplementieren Sie ein Deno-Upgrade basierend auf Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie sende ich Go WebSocket-Nachrichten? Wie sende ich Go WebSocket-Nachrichten? Jun 03, 2024 pm 04:53 PM

In Go können WebSocket-Nachrichten mit dem Paket gorilla/websocket gesendet werden. Konkrete Schritte: Stellen Sie eine WebSocket-Verbindung her. Senden Sie eine Textnachricht: Rufen Sie WriteMessage(websocket.TextMessage,[]byte("message")) auf. Senden Sie eine binäre Nachricht: Rufen Sie WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}) auf.

Vertiefendes Verständnis des Golang-Funktionslebenszyklus und des Variablenumfangs Vertiefendes Verständnis des Golang-Funktionslebenszyklus und des Variablenumfangs Apr 19, 2024 am 11:42 AM

In Go umfasst der Funktionslebenszyklus Definition, Laden, Verknüpfen, Initialisieren, Aufrufen und Zurückgeben; der Variablenbereich ist in Funktionsebene und Blockebene unterteilt. Variablen innerhalb einer Funktion sind intern sichtbar, während Variablen innerhalb eines Blocks nur innerhalb des Blocks sichtbar sind .

Wie kann ich Zeitstempel mithilfe regulärer Ausdrücke in Go abgleichen? Wie kann ich Zeitstempel mithilfe regulärer Ausdrücke in Go abgleichen? Jun 02, 2024 am 09:00 AM

In Go können Sie reguläre Ausdrücke verwenden, um Zeitstempel abzugleichen: Kompilieren Sie eine Zeichenfolge mit regulären Ausdrücken, z. B. die, die zum Abgleich von ISO8601-Zeitstempeln verwendet wird: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Verwenden Sie die Funktion regexp.MatchString, um zu überprüfen, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt.

Der Unterschied zwischen Golang und Go-Sprache Der Unterschied zwischen Golang und Go-Sprache May 31, 2024 pm 08:10 PM

Go und die Go-Sprache sind unterschiedliche Einheiten mit unterschiedlichen Eigenschaften. Go (auch bekannt als Golang) ist bekannt für seine Parallelität, schnelle Kompilierungsgeschwindigkeit, Speicherverwaltung und plattformübergreifende Vorteile. Zu den Nachteilen der Go-Sprache gehören ein weniger umfangreiches Ökosystem als andere Sprachen, eine strengere Syntax und das Fehlen dynamischer Typisierung.

Wie vermeidet man Speicherlecks bei der technischen Leistungsoptimierung von Golang? Wie vermeidet man Speicherlecks bei der technischen Leistungsoptimierung von Golang? Jun 04, 2024 pm 12:27 PM

Speicherlecks können dazu führen, dass der Speicher des Go-Programms kontinuierlich zunimmt, indem: Ressourcen geschlossen werden, die nicht mehr verwendet werden, wie z. B. Dateien, Netzwerkverbindungen und Datenbankverbindungen. Verwenden Sie schwache Referenzen, um Speicherlecks zu verhindern, und zielen Sie auf Objekte für die Garbage Collection ab, wenn sie nicht mehr stark referenziert sind. Bei Verwendung von Go-Coroutine wird der Speicher des Coroutine-Stapels beim Beenden automatisch freigegeben, um Speicherverluste zu vermeiden.

Wie kann ich die Golang-Funktionsdokumentation in der IDE anzeigen? Wie kann ich die Golang-Funktionsdokumentation in der IDE anzeigen? Apr 18, 2024 pm 03:06 PM

Go-Funktionsdokumentation mit der IDE anzeigen: Bewegen Sie den Cursor über den Funktionsnamen. Drücken Sie den Hotkey (GoLand: Strg+Q; VSCode: Nach der Installation von GoExtensionPack F1 und wählen Sie „Go:ShowDocumentation“).

Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen May 03, 2024 am 10:54 AM

Das Testen gleichzeitiger Funktionen in Einheiten ist von entscheidender Bedeutung, da dies dazu beiträgt, ihr korrektes Verhalten in einer gleichzeitigen Umgebung sicherzustellen. Beim Testen gleichzeitiger Funktionen müssen grundlegende Prinzipien wie gegenseitiger Ausschluss, Synchronisation und Isolation berücksichtigt werden. Gleichzeitige Funktionen können Unit-Tests unterzogen werden, indem Rennbedingungen simuliert, getestet und Ergebnisse überprüft werden.

Was ist zu beachten, wenn Golang-Funktionen Kartenparameter empfangen? Was ist zu beachten, wenn Golang-Funktionen Kartenparameter empfangen? Jun 04, 2024 am 10:31 AM

Beim Übergeben einer Karte an eine Funktion in Go wird standardmäßig eine Kopie erstellt und Änderungen an der Kopie haben keinen Einfluss auf die Originalkarte. Wenn Sie die Originalkarte ändern müssen, können Sie sie über einen Zeiger übergeben. Leere Karten müssen mit Vorsicht behandelt werden, da es sich technisch gesehen um Nullzeiger handelt und die Übergabe einer leeren Karte an eine Funktion, die eine nicht leere Karte erwartet, einen Fehler verursacht.

See all articles