{"id":28387046,"url":"https://github.com/li-giegie/upgrade","last_synced_at":"2025-07-27T08:33:39.821Z","repository":{"id":293879078,"uuid":"985381234","full_name":"Li-giegie/upgrade","owner":"Li-giegie","description":"upgrade is a Go library for upgrading executables at runtime.upgrade 是一个用于在运行时升级可执行文件的 Go 语言库","archived":false,"fork":false,"pushed_at":"2025-05-18T07:02:50.000Z","size":2,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-26T19:46:55.121Z","etag":null,"topics":["go","tools-utils","upgrade-yourself"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Li-giegie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-17T16:36:59.000Z","updated_at":"2025-05-18T07:02:53.000Z","dependencies_parsed_at":"2025-05-17T18:20:46.200Z","dependency_job_id":"1129a160-c266-4a02-96af-4a6e628466e4","html_url":"https://github.com/Li-giegie/upgrade","commit_stats":null,"previous_names":["li-giegie/upgrade"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Li-giegie/upgrade","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Li-giegie%2Fupgrade","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Li-giegie%2Fupgrade/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Li-giegie%2Fupgrade/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Li-giegie%2Fupgrade/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Li-giegie","download_url":"https://codeload.github.com/Li-giegie/upgrade/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Li-giegie%2Fupgrade/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267329382,"owners_count":24069851,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","tools-utils","upgrade-yourself"],"created_at":"2025-05-30T16:39:30.188Z","updated_at":"2025-07-27T08:33:39.816Z","avatar_url":"https://github.com/Li-giegie.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Upgrade Library\n## 简介\nupgrade 是一个用于在运行时升级可执行文件的 Go 语言库。该库针对不同的操作系统（Windows、Linux、macOS）提供了不同的文件替换策略，以确保在运行中的可执行文件能够被安全地替换为新版本。\n### 特点\n- 跨平台支持：支持 Windows、Linux 和 macOS 操作系统。\n- 运行时升级：允许在程序运行时对可执行文件进行升级。\n- 简单易用：提供了简单的 API 接口，方便集成到现有项目中。\n## 安装\n使用 go get 命令安装该库：\n```shell\ngo get github.com/Li-giegie/upgrade\n```\n## 使用方法\n### 示例代码\n以下是一个简单的示例，展示了如何使用 upgrade 库进行可执行文件的升级：\n```go\npackage main\n\nimport (\n    \"flag\"\n    \"github.com/Li-giegie/upgrade\"\n    \"log\"\n    \"os\"\n    \"time\"\n)\n\nvar isUpgrade = flag.Bool(\"upgrade\", false, \"upgrade to the latest version\")\nvar dstFile = flag.String(\"dst\", \"\", \"dst filename\")\n\nfunc main() {\n    flag.Parse()\n    if !*isUpgrade {\n        // 1. go build -o a.exe\n        Start(\"Process-A\")\n\n        // 2. go build -o a.exe\n        //Start(\"Process-B\")\n        return\n    }\n    err := upgrade.Upgrade(*dstFile, os.Args[0])\n    if err != nil {\n        log.Fatal(err)\n    }\n    log.Println(\"upgrade to the latest version\")\n}\n\nfunc Start(name string) {\n    for i := 0; i \u003c 100; i++ {\n        log.Printf(\"%s running\\n\", name)\n        time.Sleep(1 * time.Second)\n    }\n}\n```\n首先构建一个a可执行程序文件 go build -o a.exe\n\n把源码中a进程的代码注释掉，b进程的代码解开注释\n```go\nif !*isUpgrade {\n    // 1. go build -o a.exe\n    //Start(\"Process-A\")\n\n    // 2. go build -o a.exe\n    Start(\"Process-B\")\n    return\n}\n```\n在构建一个b可执行程序文件，作为a可执行程序的新版本 go build -o b.exe\n\n执行a.exe 会间隔1秒钟输出Process-A的文本\n\n执行 a.exe -upgrade -dst b.exe 后a可执行程序文件就被替换为b可执行程序文件了\n\n在windows系统中，原本a.exe被命名为 纳秒时间戳+.+随机数+.+源文件名（111111.123123.a.exe）可以使用UpgradeWithOutFilename函数入参传递outFileName指针以获取生成的随机文件名\n\n再次执行a.exe就能看到Process-B的文本输出了\n### 代码解释\n1. 命令行参数：通过 flag 包解析命令行参数，-upgrade 用于指定是否进行升级操作，-dst 用于指定目标文件的路径。\n2. 升级操作：调用 upgrade.Upgrade 函数进行升级操作，该函数接受目标文件路径和源文件路径作为参数。\n### 操作系统支持\n## Windows\n在 Windows 系统中，运行中的可执行文件不能被删除，但可以重命名。因此，upgrade 库会先将当前进程的可执行文件重命名为一个随机的文件名，然后将升级下载的新文件重命名为当前进程的文件名。\n### Linux 和 macOS\n在 Linux 和 macOS 系统中，直接对可执行程序文件进行覆盖命名。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fli-giegie%2Fupgrade","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fli-giegie%2Fupgrade","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fli-giegie%2Fupgrade/lists"}