Go语言学习: cobra,开发一个 ytbdown/yt-dlp/cli 下载工具

一个命令行开发包 ytbdown 开发过程记录
更新于: 2024-03-02 09:39:22

目标

想开发一个基于 yt-dlp的下载工具,目前主要的目标是给出一个 youtube url ,下载一个 video/mp3 到当前目录。

整体思路

  •  安装 yt-dlp 命令(这个不包含在这个命令里),可能会给一个提示
  • goreleaser 打包到 macos 下使用
  • 写一个 brew 命令,用于分发给别人使用

项目

安装 goreleaser

官网: https://goreleaser.com/install/

brew install goreleaser

# 安装 yt-dlp 代替 youtube-dl,因为下载速度相差太大
pip install yt-dlp

yt-dlp(代替 youtube-dl的工具)

安装过程,这里省略啦

$ yt-dlp  --version
2021.12.17

新建 cobra 项目

# 新建
cd ytbdown
go mod init
cobra-cli init .
# 安装包<此命令行,直接可以调试了>
go install

# 添加子命令<我的项目中目前不需要>
cobra-cli add mp3

程序结构

.
├── LICENSE
├── cmd
│   └── root.go
├── go.mod
├── go.sum
├── main.go
└── misc
    └── index.go

打包

# 初始化配置
goreleaser init
# 添加tag
git tag -a v0.0.1 -m "chore: First release" && git push origin v0.0.1
# 打包
goreleaser --rm-dist

tag的常用操作

git tag -d v0.0.1
git push --delete origin v0.0.1

配置

# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
before:
  hooks:
    # You may remove this if you don't use go modules.
    - go mod tidy
    # you may remove this if you don't need go generate
    - go generate ./...
builds:
  - id: ytbdown
    binary: ytbdown
    goos:
      - darwin
archives:
  - replacements:
      darwin: macos
      linux: Linux
checksum:
  name_template: 'checksums.txt'
snapshot:
  name_template: "{{ incpatch .Version }}-next"
changelog:
  sort: asc
  filters:
    exclude:
      - '^docs:'
      - '^test:'

添加一个 brew 安装命令

预期效果: brew install afeiship/jswork/ytbdown

class Ytbdown < Formula
  desc "Youtube download based on youtube-dl."
  homepage "https://js.work"
  url "https://www.dev.com/assets/ytbdown_0.0.1_macos_amd64.tar.gz"
  license "MIT"
  version "0.0.1"

  def install
    chmod 0755, "ytbdown"
    bin.install "ytbdown"
  end
end

下载一个 mp3/mp4

$ ytbdown -3 https://www.youtube.com/watch?v=BTfqMWSsrOY
$ ytbdown -4 https://www.youtube.com/watch?v=BTfqMWSsrOY

发布新版本

# 1. coding & git commit & push
# 2. taging
git tag -a v0.0.5 -m "fix: name + url space" && git push origin v0.0.5
# 3. 临时删除 GITLAB_TOKEN(因为同时存在 github_token 和 gitlab_token 这个发布会失败)
unset GITLAB_TOKEN
# 4. publish
goreleaser --rm-dist
# 5. 更新 homebrew-jswork 安装脚本

参考