Composer-style dependency workflow for Vala + Meson
Resolve packages, install system deps, and generate subproject wiring automatically.
Install Β· CLI Β· GitHub Actions Β· Meson Β· Build Β· Test
Tip
Quick start:
vamposer init
vamposer install --devDependency manager for Vala projects inspired by Composer/Go modules and integrated with Meson subprojects.
| Section | What you get |
|---|---|
| β¨ What it does | Overview of what vamposer install resolves, installs, and generates |
| π Run | Install instructions for Linux and Windows |
| GitHub Actions | Reusable workflow setup for CI |
| π» CLI usage | Core commands (init, install, version, completion) |
| π¦ Release artifacts | What gets published in releases |
| βοΈ Config format | vamposer.json schema and dependency structure |
| π§© Meson integration | Generated Meson/wrap files and integration notes |
| π οΈ Build | Distro-specific system deps and build steps |
| β Test | Test execution commands |
| π License | License and legal metadata |
vamposer install currently performs:
- loading
vamposer.json - checking
system_dependenciesviapkg-config --exists - attempting best-effort installation of missing
system_dependenciesvia detected system package manager- includes distro package-name mapping for common pkg-config names (e.g.
gtk4,libadwaita-1,gee-0.8) - unresolved system deps are reported as warning and install continues with VCS dependencies
- includes distro package-name mapping for common pkg-config names (e.g.
- resolving Git-like dependency IDs to repository URLs
- first expanding aliases from
vamposer.aliases.json(if present in project root) - then applying
owner/reposhortcut resolution
- first expanding aliases from
- cloning dependencies into
subprojects/<project-name> - generating Meson helper files:
vamposer/meson.buildvamposer.buildsubprojects/<project-name>.wrapsubprojects/vamposer.buildsubprojects/vamposer/meson.build
Default install includes only dependencies. Use vamposer install --dev to include both dependencies and dependencies-dev.
Manual install (curl + chmod):
curl -fL -o vamposer-linux \
https://github.com/ValaTux/vamposer/releases/latest/download/vamposer-linux
curl -fL -o vamposer-linux.sha256 \
https://github.com/ValaTux/vamposer/releases/latest/download/vamposer-linux.sha256
sha256sum -c vamposer-linux.sha256
chmod +x vamposer-linux
sudo install -m 0755 vamposer-linux /usr/local/bin/vamposerVerify installation:
vamposer --helpSelf-upgrade the installed binary:
sudo vamposer self-upgradeManual uninstall:
sudo rm -f /usr/local/bin/vamposer
hash -rManual install (PowerShell):
$InstallDir = Join-Path $env:LOCALAPPDATA 'Programs\Vamposer'
New-Item -ItemType Directory -Force -Path $InstallDir | Out-Null
$ExePath = Join-Path $InstallDir 'vamposer.exe'
$ChecksumPath = Join-Path $InstallDir 'vamposer.exe.sha256'
Invoke-WebRequest -Uri 'https://github.com/ValaTux/vamposer/releases/latest/download/vamposer.exe' -OutFile $ExePath
Invoke-WebRequest -Uri 'https://github.com/ValaTux/vamposer/releases/latest/download/vamposer.exe.sha256' -OutFile $ChecksumPath
$ExpectedHash = (Get-Content $ChecksumPath).Split(' ')[0].Trim().ToLower()
$ActualHash = (Get-FileHash -Algorithm SHA256 $ExePath).Hash.ToLower()
if ($ExpectedHash -ne $ActualHash) {
throw 'Checksum verification failed.'
}
$UserPath = [Environment]::GetEnvironmentVariable('Path', 'User')
if (($UserPath -split ';') -notcontains $InstallDir) {
[Environment]::SetEnvironmentVariable('Path', ($UserPath.TrimEnd(';') + ';' + $InstallDir), 'User')
}Verify installation (new terminal):
vamposer --helpSelf-upgrade:
vamposer self-upgradeManual uninstall on Windows (PowerShell):
$InstallDir = Join-Path $env:LOCALAPPDATA 'Programs\Vamposer'
$UserPath = [Environment]::GetEnvironmentVariable('Path', 'User')
[Environment]::SetEnvironmentVariable('Path', (($UserPath -split ';' | Where-Object { $_ -and $_ -ne $InstallDir }) -join ';'), 'User')
Remove-Item -Recurse -Force $InstallDirUse the reusable setup action from other repositories:
name: CI
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Setup Vamposer
uses: ValaTux/vamposer@v0.7.5
with:
version: latest
- name: Verify Vamposer
run: vamposer version
- name: Install vamposer dependencies
run: vamposer install --devversion can be latest (default) or a concrete release like v0.7.5.
The action output installed-version is resolved from vamposer version on Linux; on Windows it reports the requested input value.
Initialize a new project config:
vamposer initInitialize with custom config path:
vamposer init path/to/vamposer.jsonvamposer installInstall including development dependencies:
vamposer install --devShow CLI help:
vamposer --helpShow installed CLI version:
vamposer versionInstall shell completion for current user:
vamposer completion installRunning vamposer completion install again also refreshes (updates) existing completion scripts.
On Linux, Vamposer also performs a best-effort completion auto-install on first run for bash/zsh.
Disable this behavior with VAMPOSER_NO_AUTO_COMPLETION=1.
Enable Bash completion (without install):
source completions/vamposer.bashEnable Zsh completion (without install):
fpath=("$(pwd)/completions" $fpath)
autoload -Uz compinit && compinitUpgrade the installed binary:
sudo vamposer self-upgradeOn Linux, self-upgrade also performs a best-effort refresh of shell completion for the current user.
Disable colors if needed:
NO_COLOR=1 vamposer installAdd or update a dependency in config:
vamposer require github.com/ValaTux/testcases masterPackage aliases source:
{
"ValaTux/testcases": "github.com/ValaTux/testcases",
"YourOrg/your-repo": "github.com/YourOrg/your-repo"
}Vamposer loads aliases from https://raw.githubusercontent.com/ValaTux/vamposer/master/vamposer.aliases.json (before automatic host expansion). Alias targets are expected as repository IDs (owner/repo, github.com/owner/repo, or full URL).
Global aliases are also fetched from:
https://github.com/ValaTux/vamposer (vamposer.aliases.json on master via raw.githubusercontent.com)
Want your library/package alias included globally? Open a PR against vamposer.aliases.json in this repository or write to [Alias] Requests.
Project-level aliases in vamposer.json are also supported.
Use aliases for direct key/value overrides and alias_sources for one or more extra remote JSON alias lists.
Add or update a development dependency in config:
vamposer require --dev github.com/ValaTux/testcases masterRemove a dependency from config:
vamposer remove github.com/ValaTux/testcasesRemove a development dependency from config:
vamposer remove --dev github.com/ValaTux/testcasesForce refresh all dependencies (re-clone):
vamposer updateForce refresh all dependencies including development dependencies:
vamposer update --devForce refresh one dependency:
vamposer update github.com/ValaTux/testcasesForce refresh one development dependency:
vamposer update --dev github.com/ValaTux/testcasesCustom config path:
vamposer install path/to/vamposer.jsonCustom config path with development dependencies:
vamposer install --dev path/to/vamposer.jsonTag-based release workflow (v*) publishes:
- compatibility ZIP (
<repo-name>-<tag>-linux.zip) - standalone Linux binary (
vamposer-linux) + checksum (.sha256) - Debian package (
vamposer_<version>_amd64.deb) - RPM package (
vamposer-<version>-*.x86_64.rpm) - Ubuntu bundle (
vamposer-<tag>-ubuntu.tar.gz) + raw CLI binary - Fedora bundles (
vamposer-<tag>-fedora41.tar.gz...fedora44) + raw CLI binary - Arch bundle (
vamposer-<tag>-arch.tar.gz) + raw CLI binary - Windows bundle (
vamposer-<tag>-windows.zip) +vamposer.exe - Flatpak bundle (
vamposer-<tag>-flatpak.flatpak)
Current official release artifacts target x86_64 only. Support for additional architectures will be considered once there is a concrete user need or issue requesting it.
vamposer.json example:
{
"name": "com.github.ValaTux.my-app",
"version": "1.0.0",
"description": "Example app using Vamposer",
"dependencies": {
"github.com/ValaTux/testcases": "master",
"github.com/ValaTux/downloader-lib": "master"
},
"dependencies-dev": {
"github.com/ValaTux/dev-tools": "master"
},
"aliases": {
"my-lib": "github.com/MyOrg/my-lib",
"ValaTux/testcases": "gitlab.com/MyOrg/testcases-fork"
},
"alias_sources": [
"https://example.com/vamposer.aliases.json",
"https://raw.githubusercontent.com/MyOrg/vamposer-aliases/main/aliases.json"
],
"system_dependencies": {
"gtk4": ">=4.10",
"libadwaita-1": ">=1.4",
"gee-0.8": "*"
}
}dependencieskey is repository ID/path, value is tag/branch/revision.dependencies-devkey is for development-only Git dependencies, same value format asdependencies.- Short form without protocol is preferred (
github.com/org/repo) and is resolved ashttps://<id>.git. - Full URLs are also supported, e.g.
https://github.com/org/repoorhttps://github.com/org/repo.git. - Works with GitHub, GitLab, Codeberg and self-hosted Git servers (domain/path format).
- Supported forms include
gitlab.com/group/project,https://gitlab.com/group/project,ssh://git@gitlab.com/group/project, andgit@gitlab.com:group/project. system_dependencieswith"*"checks only package presence.
Generated vamposer/meson.build (project root) defines vamposer_deps, vamposer_dev_deps, and vamposer_all_deps:
vamposer_deps = [
dependency('testcases', fallback: ['testcases', 'testcases_dep']),
dependency('downloader-lib', fallback: ['downloader-lib', 'downloader_lib_dep'])
]
vamposer_dev_deps = [
dependency('my-test-helper', fallback: ['my-test-helper', 'my_test_helper_dep'])
]
vamposer_all_deps = [
dependency('testcases', fallback: ['testcases', 'testcases_dep']),
dependency('downloader-lib', fallback: ['downloader-lib', 'downloader_lib_dep']),
dependency('my-test-helper', fallback: ['my-test-helper', 'my_test_helper_dep'])
]Use in your project meson.build (preferred):
# Loads vamposer/meson.build generated by Vamposer
subdir('vamposer')
executable('my-app',
sources,
dependencies: [
dependency('gtk4'),
dependency('libadwaita-1'),
vamposer_deps
]
)Important: use this in the consumer app project where you run vamposer install.
Do not add subdir('vamposer') to this Vamposer tool repository itself.
Backward-compatible option (also generated):
subdir('subprojects/vamposer')Build dependencies:
- tools:
meson,ninja,valac,pkg-config - Vala packages:
glib-2.0,gee-0.8,json-glib-1.0 - runtime tools used by dependency operations:
git,pkg-config
Install dependencies (examples):
sudo apt-get update
sudo apt-get install -y \
git \
meson \
ninja-build \
valac \
pkg-config \
libglib2.0-dev \
libgee-0.8-dev \
libjson-glib-devsudo dnf install -y \
git \
meson \
ninja-build \
vala \
pkgconf-pkg-config \
glib2-devel \
libgee-devel \
json-glib-develsudo pacman -S --needed \
git \
meson \
ninja \
vala \
pkgconf \
glib2 \
libgee \
json-glibmake buildor
meson setup builddir
meson compile -C builddirTest dependencies:
vala_testcases(resolved from system if present, otherwise fromsubprojects/vala_testcasesfallback)- all Build dependencies above
meson test -C builddir --verboseor
make testsVamposer is an open-source project created and maintained to improve the Vala ecosystem. Building and supporting package management infrastructure requires dedicated time for updates, features, and registry maintenance.
If Vamposer helps you build Vala applications or speeds up your workflow, please consider supporting its development:
- π Accelerates new features: Dedicated time for registry development, CLI improvements, and Meson build integration.
- π οΈ Long-term maintenance: Ensures fast bug fixes, compatibility updates, and stable releases.
- π Documentation & Guides: Better guides and examples for community adoption.
Thank you to everyone supporting the project!
(Sponsors will be listed here. Join them by becoming a sponsor!)
Apache-2.0 (see LICENSE and NOTICE).