https://github.com/balibuild/bali
Bali - Minimalist Golang build and packaging tool
https://github.com/balibuild/bali
build darwin golang installer interesting linux package posix windows
Last synced: 3 months ago
JSON representation
Bali - Minimalist Golang build and packaging tool
- Host: GitHub
- URL: https://github.com/balibuild/bali
- Owner: balibuild
- License: mit
- Created: 2020-04-14T10:15:14.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2026-01-12T06:36:52.000Z (3 months ago)
- Last Synced: 2026-01-12T16:31:59.823Z (3 months ago)
- Topics: build, darwin, golang, installer, interesting, linux, package, posix, windows
- Language: Go
- Homepage:
- Size: 932 KB
- Stars: 68
- Watchers: 1
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Bali - Minimalist Golang build and packaging tool
[](https://github.com/balibuild/bali/actions)
[简体中文](./README.zh-CN.md)
Bali is a *minimal Golang build and packaging tool* developed using Golang.
## Feature
Bali has some functions that I think are useful:
+ Build parameters support derivation of environment variables
+ Package, create compressed package, support `rpm`, `tar`, `zip`, `sh`.
+ The Windows platform supports embedded version information, icons, and application manifest.
rpm supported compression:
+ gzip
+ zstd
+ lzma
+ xz
tar supported compression:
+ none --> pure tar
+ gzip --> tar.gz
+ zstd --> tar.zst
+ xz --> tar.xz
+ bzip2 --> tar.bz2
+ brotli --> tar.br
sh supported compression:
+ none --> pure tar
+ gzip --> tar.gz
+ zstd --> tar.zst
+ xz --> tar.xz
+ bzip2 --> tar.bz2
zip supported compression:
+ deflate
+ zstd
+ bzip2
+ xz
Bali's command line help information is as follows:
```txt
Usage: bali [flags]
Bali - Minimalist Golang build and packaging tool
Flags:
-h, --help Show context-sensitive help.
-M, --module="." Explicitly specify a module directory
-B, --build="build" Explicitly specify a build directory
-V, --verbose Make the operation more talkative
-v, --version Print version information and quit
Commands:
build Compile the current module (default)
update Update dependencies as recorded in the go.mod
clean Remove generated artifacts
Run "bali --help" for more information on a command.
```
bali build command:
```txt
Usage: bali build [flags]
Compile the current module (default)
Flags:
-h, --help Show context-sensitive help.
-M, --module="." Explicitly specify a module directory
-B, --build="build" Explicitly specify a build directory
-V, --verbose Make the operation more talkative
-v, --version Print version information and quit
-T, --target="windows" Target OS for which the code is compiled
-A, --arch="amd64" Target architecture for which the code is compiled
--release=STRING Specifies the rpm package tag version
-D, --destination="dest" Specify the package save destination
--pack=PACK,... Packaged in a specific format. supported: zip,
tar, sh, rpm
--compression=STRING Specifies the compression method
```
## Instructions
Common build:
```shell
cd /path/to/project
bali
```
Create `Tar.gz` compressed package:
```shell
bali --pack=tar
```
Create `STGZ` installation package, mainly used on Linux/macOS platform:
```shell
bali --pack=sh --target=linux --arch=amd64
```
Output the installation package to the specified directory:
```shell
bali --pack=rpm --target=linux --arch=amd64 --dest=/tmp/output
```
Create multiple packages at once:
```shell
bali --target=linux --arch=arm64 '--pack=sh,rpm,tar'
```
## Bali build file format
Project file `bali.toml`:
```toml
# https://toml.io/en/
name = "bali"
summary = "Bali - Minimalist Golang build and packaging tool"
description = "Bali - Minimalist Golang build and packaging tool"
package-name = "bali-dev"
version = "3.1.2"
license = "MIT"
prefix = "/usr/local"
crates = [
"cmd/bali", # crates
"cmd/peassets",
]
[[include]]
path = "LICENSE"
destination = "share"
rename = "BALI-COPYRIGHT.txt"
permissions = "0664"
```
Built-in environment variables:
+ `BUILD_VERSION` is filled by the `version` field of balisrc.json
+ `BUILD_TIME` is filled by the build time formatted according to `RFC3339`
+ `BUILD_COMMIT` is filled by the commit id of the repository (when it is a git repository)
+ `BUILD_GOVERSION` is filled by `go version` output (removed `go version` prefix)
+ `BUILD_BRANCH` is filled with the branch name of the repository (when it is a git repository)
Other environment variables can be used in goflags.
Program build file `crate.toml`:
```toml
name = "bali"
description = "Bali - Minimalist Golang build and packaging tool"
destination = "bin"
version = "3.1.2"
goflags = [
"-ldflags",
"-X 'main.VERSION=$BUILD_VERSION' -X 'main.BUILD_TIME=$BUILD_TIME' -X 'main.BUILD_BRANCH=$BUILD_BRANCH' -X 'main.BUILD_COMMIT=$BUILD_COMMIT' -X 'main.BUILD_REFNAME=$BUILD_REFNAME' -X 'main.BUILD_GOVERSION=$BUILD_GOVERSION'",
]
```
Windows-related manifest files (crate.toml sibling):`winres.toml:`
```toml
icon = "res/bali.ico" # data:base64-content
manifest = """data:
Bali
true
"""
[FixedFileInfo]
FileFlagsMask = "3f"
FileFlags = "00"
FileOS = "40004"
FileType = "01"
FileSubType = "00"
[FixedFileInfo.FileVersion]
Major = 0
Minor = 0
Patch = 0
Build = 0
[FixedFileInfo.ProductVersion]
Major = 0
Minor = 0
Patch = 0
Build = 0
[StringFileInfo]
Comments = ""
CompanyName = "Bali Team"
FileDescription = "Bali - Minimalist Golang build and packaging tool"
FileVersion = ""
InternalName = "bali.exe"
LegalCopyright = "Copyright © 2025. Bali contributors"
LegalTrademarks = ""
OriginalFilename = "bali.exe"
PrivateBuild = ""
ProductName = "Bali"
ProductVersion = ""
SpecialBuild = ""
[VarFileInfo]
[VarFileInfo.Translation]
LangID = "0409"
CharsetID = "04B0"
```
Bali integrates [`goversioninfo`](https://github.com/josephspurrier/goversioninfo). When the target is Windows, it can embed version information (`winres.toml`) into the executable program.
The benefits of adding a reference program manifest are self-evident. For example, Windows UAC privilege escalation, Windows 10 long path support (ie path support> 260 characters), Windows Vista style controls, TaskDialog, DPI settings, etc. all need to modify the application manifest.
## Bootstrap
Usually after installing and configuring the Golang environment, you can follow the following command to complete Bali's bootstrapping:
UNIX:
```shell
./script/bootstrap.sh
```
Windows:
```ps1
# powershell
pwsh ./script/bootstrap.ps1
# cmd
script/bootstrap.bat
```
## Github Actions Use bali
```
go install github.com/balibuild/bali/v3/cmd/bali@latest
```
## Thanks
Bali's ability to automatically add version information to PE files is inseparable from the contribution of open source projects. Thank you very much [akavel/rsrc](https://github.com/akavel/rsrc) and [josephspurrier/goversioninfo](https://github.com/josephspurrier/goversioninfo) Developer and maintainer of two projects.
The Bali Github organization and Bali's own icons come from [www.flaticon.com](https://www.flaticon.com/) The creator is [Smashicons](https://www.flaticon.com/authors/smashicons) .