分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

(golang一站式框架, 支持api,web,定时任务,消息消费,常用数据库,日志,监控等)[https://github.com/micro-plat/hydra]
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import argparse
import tarfile
import tempfile
import shutil
import subprocess
from urllib.request import urlopen, Request
from urllib.error import URLError
def find_go_install_path():
"""查找当前Go安装路径"""
# 尝试从环境变量获取
go_root = os.environ.get('GOROOT')
if go_root and os.path.exists(go_root):
return go_root
# 尝试常见安装路径
common_paths = [
'/usr/local/go', # 默认安装路径
'/usr/lib/go',
'/opt/go',
os.path.expanduser('~/go') # 用户目录安装
]
for path in common_paths:
if os.path.exists(path):
return path
# 尝试通过which查找
try:
go_bin_path = subprocess.check_output(['which', 'go'], text=True).strip()
if go_bin_path:
return os.path.dirname(os.path.dirname(go_bin_path))
except subprocess.CalledProcessError:
pass
raise FileNotFoundError("无法找到Go安装目录,请手动指定或检查安装")
def download_with_progress(url, destination):
"""带进度条的下载函数"""
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
try:
with urlopen(req) as response:
total_size = int(response.headers.get('Content-Length', 0))
block_size = 8192
downloaded = 0
print(f"下载中: {os.path.basename(url)}")
print(f"文件大小: {total_size / (1024*1024):.2f} MB")
with open(destination, 'wb') as f:
while True:
chunk = response.read(block_size)
if not chunk:
break
f.write(chunk)
downloaded += len(chunk)
# 进度显示
percent = downloaded / total_size * 100 if total_size > 0 else 0
progress_bar = '#' * int(percent / 2) # 50个字符的进度条
sys.stdout.write(f"\r[{progress_bar.ljust(50)}] {percent:.1f}% ({downloaded/(1024*1024):.2f}MB)")
sys.stdout.flush()
print("\n下载完成!")
return True
except URLError as e:
print(f"\n下载失败: {e.reason}")
return False
def main():
parser = argparse.ArgumentParser(description='Go语言版本升级工具')
parser.add_argument('url', type=str, help='Go安装包下载URL')
args = parser.parse_args()
# 检查root权限
if os.geteuid() != 0:
print("请使用sudo运行此脚本")
sys.exit(1)
# 查找当前安装路径
try:
install_path = find_go_install_path()
print(f"当前Go安装路径: {install_path}")
except FileNotFoundError as e:
print(e)
sys.exit(1)
# 创建临时目录
temp_dir = tempfile.mkdtemp()
download_path = os.path.join(temp_dir, os.path.basename(args.url))
try:
# 下载文件
if not download_with_progress(args.url, download_path):
sys.exit(1)
# 备份旧版本
backup_path = f"{install_path}.bak"
if os.path.exists(backup_path):
shutil.rmtree(backup_path)
shutil.move(install_path, backup_path)
print(f"已备份旧版本到: {backup_path}")
# 解压新版本
print("正在安装新版本...")
with tarfile.open(download_path, 'r:gz') as tar:
# 解压到父目录
parent_dir = os.path.dirname(install_path)
tar.extractall(path=parent_dir)
# 验证安装
new_go_path = os.path.join(parent_dir, 'go')
if not os.path.exists(new_go_path):
print("安装失败: 解压后未找到go目录")
# 恢复备份
shutil.rmtree(new_go_path, ignore_errors=True)
shutil.move(backup_path, install_path)
print("已恢复旧版本")
sys.exit(1)
print("安装成功!")
print(f"新版本路径: {new_go_path}")
# 验证版本
print("\n验证新版本:")
os.environ['PATH'] = f"{new_go_path}/bin:{os.environ['PATH']}"
subprocess.call(['go', 'version'])
finally:
# 清理临时文件
shutil.rmtree(temp_dir, ignore_errors=True)
print("临时文件已清理")
if __name__ == "__main__":
main()
```
(golang一站式框架, 支持api,web,定时任务,消息消费,常用数据库,日志,监控等)[https://github.com/micro-plat/hydra]
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信2060 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传