mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-03-19 20:57:53 +02:00
Merge pull request #48 from goreleaser/name-template
WIP: custom naming templates
This commit is contained in:
commit
8f0ce61122
@ -8,3 +8,7 @@ insert_final_newline = true
|
|||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
2
Makefile
2
Makefile
@ -24,7 +24,7 @@ lint: ## Run all the linters
|
|||||||
--enable=errcheck \
|
--enable=errcheck \
|
||||||
--enable=vet \
|
--enable=vet \
|
||||||
--enable=vetshadow \
|
--enable=vetshadow \
|
||||||
--deadline=20s \
|
--deadline=1m \
|
||||||
./...
|
./...
|
||||||
|
|
||||||
ci: lint test ## Run all the tests and code checks
|
ci: lint test ## Run all the tests and code checks
|
||||||
|
37
README.md
37
README.md
@ -31,14 +31,14 @@ You may then run releaser at the root of your repository:
|
|||||||
curl -s https://raw.githubusercontent.com/goreleaser/get/master/latest | bash
|
curl -s https://raw.githubusercontent.com/goreleaser/get/master/latest | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
This will build `main.go` file as `my-binary`, for _Darwin_ and _Linux_,
|
This will build `main.go` as `my-binary`, for `Darwin` and `Linux`
|
||||||
_x86_64_ and _i386_, packaging the binary, `LICENSE.md` and `README.md`
|
(`amd64` and `i386`), archive the binary and common files as `.tar.gz`,
|
||||||
and publish a new github release in the `user/repo` repository with
|
and finally, publish a new github release in the `user/repo` repository with
|
||||||
the `.tar.gz` files there.
|
archives uploaded.
|
||||||
|
|
||||||
### Homebrew
|
### Homebrew
|
||||||
|
|
||||||
To push it to a homebrew repo, just add a `brew` section:
|
To push a basic formulae a homebrew tap repo, just add a `brew` section:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
repo: user/repo
|
repo: user/repo
|
||||||
@ -66,6 +66,22 @@ build:
|
|||||||
|
|
||||||
> `oses` and `arches` should be in `GOOS`/`GOARCH`-compatible format.
|
> `oses` and `arches` should be in `GOOS`/`GOARCH`-compatible format.
|
||||||
|
|
||||||
|
### Archive customization
|
||||||
|
|
||||||
|
You can customize the name and format of the archive adding an `archive`
|
||||||
|
section:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
repo: user/repo
|
||||||
|
binary_name: my-binary
|
||||||
|
archive:
|
||||||
|
name_template: "{{.BinaryName}}_{{.Version}}_{{.Os}}_{{.Arch}}"
|
||||||
|
format: tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
> Default `name_template` is "{{.BinaryName}}_{{.Os}}_{{.Arch}}"
|
||||||
|
> Valid formats are `tar.gz` and `zip`, default is `tar.gz`
|
||||||
|
|
||||||
### Add more files
|
### Add more files
|
||||||
|
|
||||||
You might also want to change the files that are packaged by adding a `files`
|
You might also want to change the files that are packaged by adding a `files`
|
||||||
@ -80,6 +96,9 @@ files:
|
|||||||
- CHANGELOG.md
|
- CHANGELOG.md
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> By default GoReleaser adds the binary itself, `LICENCE*`, `LICENSE*`,
|
||||||
|
`README*` and `CHANGELOG*`.
|
||||||
|
|
||||||
## Wire it with travis-ci
|
## Wire it with travis-ci
|
||||||
|
|
||||||
You may want to wire this to auto-deploy your new tags on travis, for example:
|
You may want to wire this to auto-deploy your new tags on travis, for example:
|
||||||
@ -100,11 +119,11 @@ And the [homebrew formulae](https://github.com/goreleaser/homebrew-formulae/blob
|
|||||||
|
|
||||||
```rb
|
```rb
|
||||||
class Release < Formula
|
class Release < Formula
|
||||||
desc "Deliver Go binaries as fast and easily as possible."
|
desc "Deliver Go binaries as fast and easily as possible"
|
||||||
homepage "https://github.com/goreleaser/releaser"
|
homepage "https://github.com/goreleaser/releaser"
|
||||||
url "https://github.com/goreleaser/releaser/releases/download/v0.2.0/release_#{%x(uname -s).gsub(/\n/, '')}_#{%x(uname -m).gsub(/\n/, '')}.tar.gz"
|
url "https://github.com/goreleaser/releaser/releases/download/v0.2.8/release_Darwin_x86_64.tar.gz"
|
||||||
head "https://github.com/goreleaser/releaser.git"
|
version "v0.2.8"
|
||||||
version "v0.2.0"
|
sha256 "9ee30fc358fae8d248a2d7538957089885da321dca3f09e3296fe2058e7fff74"
|
||||||
|
|
||||||
def install
|
def install
|
||||||
bin.install "release"
|
bin.install "release"
|
||||||
|
38
config/archive_config.go
Normal file
38
config/archive_config.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"html/template"
|
||||||
|
|
||||||
|
"github.com/goreleaser/releaser/uname"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ArchiveConfig config used for the archive
|
||||||
|
type ArchiveConfig struct {
|
||||||
|
Format string
|
||||||
|
NameTemplate string `yaml:"name_template"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type archiveNameData struct {
|
||||||
|
Os string
|
||||||
|
Arch string
|
||||||
|
Version string
|
||||||
|
BinaryName string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ArchiveName following the given template
|
||||||
|
func (config ProjectConfig) ArchiveName(goos, goarch string) (string, error) {
|
||||||
|
var data = archiveNameData{
|
||||||
|
Os: uname.FromGo(goos),
|
||||||
|
Arch: uname.FromGo(goarch),
|
||||||
|
Version: config.Git.CurrentTag,
|
||||||
|
BinaryName: config.BinaryName,
|
||||||
|
}
|
||||||
|
var out bytes.Buffer
|
||||||
|
t, err := template.New(data.BinaryName).Parse(config.Archive.NameTemplate)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
err = t.Execute(&out, data)
|
||||||
|
return out.String(), err
|
||||||
|
}
|
23
config/archive_config_test.go
Normal file
23
config/archive_config_test.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNameTemplate(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
var config = ProjectConfig{
|
||||||
|
BinaryName: "test",
|
||||||
|
Git: GitInfo{
|
||||||
|
CurrentTag: "v1.2.3",
|
||||||
|
},
|
||||||
|
Archive: ArchiveConfig{
|
||||||
|
NameTemplate: "{{.BinaryName}}_{{.Os}}_{{.Arch}}_{{.Version}}",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
name, err := config.ArchiveName("darwin", "amd64")
|
||||||
|
assert.NoError(err)
|
||||||
|
assert.Equal("test_Darwin_x86_64_v1.2.3", name)
|
||||||
|
}
|
@ -34,11 +34,6 @@ type GitInfo struct {
|
|||||||
Diff string
|
Diff string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ArchiveConfig
|
|
||||||
type ArchiveConfig struct {
|
|
||||||
Format string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectConfig includes all project configuration
|
// ProjectConfig includes all project configuration
|
||||||
type ProjectConfig struct {
|
type ProjectConfig struct {
|
||||||
Repo string
|
Repo string
|
||||||
@ -112,6 +107,9 @@ func (config *ProjectConfig) fillBasicData() {
|
|||||||
if len(config.Build.Arches) == 0 {
|
if len(config.Build.Arches) == 0 {
|
||||||
config.Build.Arches = []string{"amd64", "386"}
|
config.Build.Arches = []string{"amd64", "386"}
|
||||||
}
|
}
|
||||||
|
if config.Archive.NameTemplate == "" {
|
||||||
|
config.Archive.NameTemplate = "{{.BinaryName}}_{{.Os}}_{{.Arch}}"
|
||||||
|
}
|
||||||
if config.Archive.Format == "" {
|
if config.Archive.Format == "" {
|
||||||
config.Archive.Format = "tar.gz"
|
config.Archive.Format = "tar.gz"
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ import (
|
|||||||
const formulae = `class {{ .Name }} < Formula
|
const formulae = `class {{ .Name }} < Formula
|
||||||
desc "{{ .Desc }}"
|
desc "{{ .Desc }}"
|
||||||
homepage "{{ .Homepage }}"
|
homepage "{{ .Homepage }}"
|
||||||
url "https://github.com/{{ .Repo }}/releases/download/{{ .Tag }}/{{ .BinaryName }}_Darwin_x86_64.{{ .Format }}"
|
url "https://github.com/{{ .Repo }}/releases/download/{{ .Tag }}/{{ .File }}.{{ .Format }}"
|
||||||
version "{{ .Tag }}"
|
version "{{ .Tag }}"
|
||||||
sha256 "{{ .SHA256 }}"
|
sha256 "{{ .SHA256 }}"
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ end
|
|||||||
`
|
`
|
||||||
|
|
||||||
type templateData struct {
|
type templateData struct {
|
||||||
Name, Desc, Homepage, Repo, Tag, BinaryName, Caveats, Format, SHA256 string
|
Name, Desc, Homepage, Repo, Tag, BinaryName, Caveats, File, Format, SHA256 string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pipe for brew deployment
|
// Pipe for brew deployment
|
||||||
@ -121,7 +121,11 @@ func dataFor(config config.ProjectConfig, client *github.Client) (result templat
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sum, err := sha256sum.For("dist/" + config.BinaryName + "_Darwin_x86_64." + config.Archive.Format)
|
file, err := config.ArchiveName("darwin", "amd64")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sum, err := sha256sum.For("dist/" + file + config.Archive.Format)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -143,6 +147,7 @@ func dataFor(config config.ProjectConfig, client *github.Client) (result templat
|
|||||||
Tag: config.Git.CurrentTag,
|
Tag: config.Git.CurrentTag,
|
||||||
BinaryName: config.BinaryName,
|
BinaryName: config.BinaryName,
|
||||||
Caveats: config.Brew.Caveats,
|
Caveats: config.Brew.Caveats,
|
||||||
|
File: file,
|
||||||
Format: config.Archive.Format,
|
Format: config.Archive.Format,
|
||||||
SHA256: sum,
|
SHA256: sum,
|
||||||
}, err
|
}, err
|
||||||
|
@ -25,6 +25,7 @@ var defaultTemplateData = templateData{
|
|||||||
Name: "Test",
|
Name: "Test",
|
||||||
Repo: "caarlos0/test",
|
Repo: "caarlos0/test",
|
||||||
Tag: "v0.1.3",
|
Tag: "v0.1.3",
|
||||||
|
File: "test_Darwin_x86_64",
|
||||||
SHA256: "1633f61598ab0791e213135923624eb342196b3494909c91899bcd0560f84c68",
|
SHA256: "1633f61598ab0791e213135923624eb342196b3494909c91899bcd0560f84c68",
|
||||||
Format: "tar.gz",
|
Format: "tar.gz",
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
|
|
||||||
"github.com/goreleaser/releaser/config"
|
"github.com/goreleaser/releaser/config"
|
||||||
"github.com/goreleaser/releaser/uname"
|
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -37,11 +36,15 @@ func (Pipe) Run(config config.ProjectConfig) error {
|
|||||||
|
|
||||||
func build(system, arch string, config config.ProjectConfig) error {
|
func build(system, arch string, config config.ProjectConfig) error {
|
||||||
log.Println("Building", system+"/"+arch, "...")
|
log.Println("Building", system+"/"+arch, "...")
|
||||||
|
name, err := config.ArchiveName(system, arch)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
cmd := exec.Command(
|
cmd := exec.Command(
|
||||||
"go",
|
"go",
|
||||||
"build",
|
"build",
|
||||||
"-ldflags=-s -w -X main.version="+config.Git.CurrentTag,
|
"-ldflags=-s -w -X main.version="+config.Git.CurrentTag,
|
||||||
"-o", target(system, arch, config.BinaryName),
|
"-o", "dist/"+name+"/"+config.BinaryName,
|
||||||
config.Build.Main,
|
config.Build.Main,
|
||||||
)
|
)
|
||||||
cmd.Env = append(
|
cmd.Env = append(
|
||||||
@ -54,13 +57,8 @@ func build(system, arch string, config config.ProjectConfig) error {
|
|||||||
var stdout bytes.Buffer
|
var stdout bytes.Buffer
|
||||||
cmd.Stdout = &stdout
|
cmd.Stdout = &stdout
|
||||||
cmd.Stderr = &stdout
|
cmd.Stderr = &stdout
|
||||||
err := cmd.Run()
|
if err := cmd.Run(); err != nil {
|
||||||
if err != nil {
|
|
||||||
return errors.New(stdout.String())
|
return errors.New(stdout.String())
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func target(system, arch, binary string) string {
|
|
||||||
return "dist/" + binary + "_" + uname.FromGo(system) + "_" + uname.FromGo(arch) + "/" + binary
|
|
||||||
}
|
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
"github.com/goreleaser/releaser/config"
|
"github.com/goreleaser/releaser/config"
|
||||||
"github.com/goreleaser/releaser/pipeline/compress/tar"
|
"github.com/goreleaser/releaser/pipeline/compress/tar"
|
||||||
"github.com/goreleaser/releaser/pipeline/compress/zip"
|
"github.com/goreleaser/releaser/pipeline/compress/zip"
|
||||||
"github.com/goreleaser/releaser/uname"
|
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -40,7 +39,11 @@ type Archive interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func create(system, arch string, config config.ProjectConfig) error {
|
func create(system, arch string, config config.ProjectConfig) error {
|
||||||
file, err := os.Create("dist/" + nameFor(system, arch, config.BinaryName) + "." + config.Archive.Format)
|
name, err := config.ArchiveName(system, arch)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
file, err := os.Create("dist/" + name + "." + config.Archive.Format)
|
||||||
log.Println("Creating", file.Name(), "...")
|
log.Println("Creating", file.Name(), "...")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -53,7 +56,7 @@ func create(system, arch string, config config.ProjectConfig) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return archive.Add(config.BinaryName+ext(system), binaryPath(system, arch, config.BinaryName))
|
return archive.Add(config.BinaryName+extFor(system), "dist/"+name+"/"+config.BinaryName)
|
||||||
}
|
}
|
||||||
|
|
||||||
func archiveFor(file *os.File, format string) Archive {
|
func archiveFor(file *os.File, format string) Archive {
|
||||||
@ -63,15 +66,7 @@ func archiveFor(file *os.File, format string) Archive {
|
|||||||
return tar.New(file)
|
return tar.New(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
func nameFor(system, arch, binary string) string {
|
func extFor(system string) string {
|
||||||
return binary + "_" + uname.FromGo(system) + "_" + uname.FromGo(arch)
|
|
||||||
}
|
|
||||||
|
|
||||||
func binaryPath(system, arch, binary string) string {
|
|
||||||
return "dist/" + nameFor(system, arch, binary) + "/" + binary
|
|
||||||
}
|
|
||||||
|
|
||||||
func ext(system string) string {
|
|
||||||
if system == "windows" {
|
if system == "windows" {
|
||||||
return ".exe"
|
return ".exe"
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestExtWindows(t *testing.T) {
|
func TestExtWindows(t *testing.T) {
|
||||||
assert.Equal(t, ext("windows"), ".exe")
|
assert.Equal(t, extFor("windows"), ".exe")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExtOthers(t *testing.T) {
|
func TestExtOthers(t *testing.T) {
|
||||||
assert.Empty(t, ext("linux"))
|
assert.Empty(t, extFor("linux"))
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/google/go-github/github"
|
"github.com/google/go-github/github"
|
||||||
"github.com/goreleaser/releaser/config"
|
"github.com/goreleaser/releaser/config"
|
||||||
"github.com/goreleaser/releaser/split"
|
"github.com/goreleaser/releaser/split"
|
||||||
"github.com/goreleaser/releaser/uname"
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
@ -65,7 +64,11 @@ func description(diff string) string {
|
|||||||
|
|
||||||
func upload(client *github.Client, releaseID int, system, arch string, config config.ProjectConfig) error {
|
func upload(client *github.Client, releaseID int, system, arch string, config config.ProjectConfig) error {
|
||||||
owner, repo := split.OnSlash(config.Repo)
|
owner, repo := split.OnSlash(config.Repo)
|
||||||
name := config.BinaryName + "_" + uname.FromGo(system) + "_" + uname.FromGo(arch) + "." + config.Archive.Format
|
name, err := config.ArchiveName(system, arch)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
name = name + "." + config.Archive.Format
|
||||||
file, err := os.Open("dist/" + name)
|
file, err := os.Open("dist/" + name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
Loading…
x
Reference in New Issue
Block a user