GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - bpkg/bpkg: Lightweight bash package manager

BranchesTags
Open more actions menu

Latest commit

 

History

306 Commits
306 Commits

Folders and files

NameName
Last commit message
Last commit date
.github/workflows
.github/workflows
 
 
lib
lib
 
 
scripts
scripts
 
 
.shellcheckrc
.shellcheckrc
 
 
.travis.yml
.travis.yml
 
 
LICENSE
LICENSE
 
 
Makefile
Makefile
 
 
README.md
README.md
 
 
bpkg
bpkg
 
 
bpkg-env
bpkg-env
 
 
bpkg-getdeps
bpkg-getdeps
 
 
bpkg-init
bpkg-init
 
 
bpkg-install
bpkg-install
 
 
bpkg-json
bpkg-json
 
 
bpkg-list
bpkg-list
 
 
bpkg-package
bpkg-package
 
 
bpkg-realpath
bpkg-realpath
 
 
bpkg-run
bpkg-run
 
 
bpkg-show
bpkg-show
 
 
bpkg-source
bpkg-source
 
 
bpkg-suggest
bpkg-suggest
 
 
bpkg-term
bpkg-term
 
 
bpkg-update
bpkg-update
 
 
bpkg-utils
bpkg-utils
 
 
bpkg.json
bpkg.json
 
 
bpkg.sh
bpkg.sh
 
 
setup.sh
setup.sh
 
 

Repository files navigation

bpkg Build Status Backers on Open Collective Sponsors on Open Collective

JavaScript has npm, Ruby has Gems, Python has pip and now Shell has bpkg!

bpkg is a lightweight bash package manager. It takes care of fetching the shell scripts, installing them appropriately, setting the execution permission and more.

You can install shell scripts globally (on ${PREFIX:-/usr/local/bin}) or use them on a per-project basis (on ${BPKG_DEPS:-./deps/}), as a lazy-man "copy and paste".

  • Install
    • 0. Dependencies
    • 1. Install script
    • 2. clib
    • 3. Source Code
  • Usage
    • Installing packages
    • Packages With Dependencies
    • Running packages with bpkg
    • Retrieving package info
  • Package details
  • bpkg.json
    • name
    • version (optional)
    • description
    • global
    • install
    • scripts
    • files (optional)
    • dependencies (optional)
    • dependencies-dev (optional)
    • commands (optional)
    • commands-description (optional)
  • Packaging best practices
    • Package exports
  • Sponsors
    • Contributors
    • Backers
  • License

Install

You can install bpkg from three distinct ways:

0. Dependencies

  • curl
  • coreutils

1. Install script

Our install script is the simplest way. It takes care of everything for you, placing bpkg and related scripts on /usr/local/bin.

You can install bpkg with the get.bpkg.sh endpoint:

curl -Lo - get.bpkg.sh | bash

Or optionally paste the following on your shell and you're good to go:

curl -Lo- "https://raw.githubusercontent.com/bpkg/bpkg/master/setup.sh" | bash

or by tag/version

curl -Lo- "https://raw.githubusercontent.com/bpkg/bpkg/1.0.15/setup.sh" | bash

2. clib

clib is a package manager for C projects. If you already have it, installing bpkg is a simple matter of:

clib install bpkg/bpkg

3. Source Code

To directly install bpkg from its source code you have to clone its repository and run the setup.sh script:

git clone https://github.com/bpkg/bpkg.git
cd bpkg
./setup.sh                             # Will install bpkg in $HOME/.local/bin
sudo ./setup.sh                        # Will install bpkg in /usr/local/bin.
PREFIX=/my/custom/directory ./setup.sh # Will install bpkg in a custom directory.

Usage

You use bpkg by simply sending commands, pretty much like npm or pip.

Installing packages

Packages can either be global (on ${PREFIX:-/usr/local/bin} if installed as root or ${PREFIX:-$HOME/.local/bin} otherwize) or local (under ${BPKG_DEPS:-./deps}).

For example, here's a global install for the current user of the term package:

bpkg install term -g
term

And the same package as a local install:

bpkg install term
./deps/term/term.sh

After a local install the term.sh script is copied as term to the deps/bin directory, you can add this directory to the PATH with

export PATH=$PATH:/path_to_bkpg/deps/bin

As a bonus, you can specify a specific version:

bpkg install jwerle/[email protected] -g

Note: to do that the packages must be tagged releases on the repository.

You can also install packages without a bpkg.json (or package.json). As long as there is a Makefile in the repository it will try to invoke make install as long as the -g or --global flags are set when invoking bpkg install.

For example you could install git-standup with an omitted bpkg.json (or package.json) because of the Makefile and the install target found in it.

bpkg install stephenmathieson/git-standup -g

    warn: bpkg.json doesn`t exist
    warn: package.json doesn`t exist
    warn: Trying `make install'...
    info: install: `make install'
cp -f git-standup /usr/local/bin

Packages With Dependencies

You can install a packages dependencies with the bpkg getdeps command. These will recursively install in deps/ sub-folders to resolve all dependencies.

Note: There is no protection against circular dependencies, so be careful!

Running packages with bpkg

You can run a package script with bpkg run which will install your package globally and execute it as a command

Retrieving package info

After installing a package, you can obtain info from it using bpkg.

Supposing you're on the root of a package directory, the following commands show that package metadata:

# Asking for single information
bpkg package name
 "bpkg"
bpkg package version
 "0.0.5"
# Dumping all the metadata
bpkg package
["name"]        "bpkg"
["version"]     "0.0.5"
["description"] "Lightweight bash package manager"
["global"]      true
["install"]     "make install"

Package details

Here we lay down some info on the structure of a package.

bpkg.json

Every package must have a file called bpkg.json (for backward-compatibility package.json can also be used); it specifies package metadata on the JSON format.

Here's an example of a well-formed bpkg.json:

{
  "name": "term",
  "version": "0.0.1",
  "description": "Terminal utility functions",
  "scripts": [ "term.sh" ],
  "install": "make install"
}

All fields are mandatory except when noted. Here's a detailed explanation on all fields:

name

The name attribute is required as it is used to tell bpkg where to put it in the deps/ directory in you project.

  "name": "my-script"

version (optional)

The version attribute is not required but can be useful. It should correspond to the version that is associated with the installed package.

  "version": "0.0.1"

description

A human readable description of what the package offers for functionality.

  "description": "This script makes monkeys jump out of your keyboard"

global

Indicates that the package is only intended to be install as a script. This allows the omission of the -g or --global flag during installation.

  "global": "true"

install

Shell script used to invoke in the install script. This is required if the global attribute is set to true or if the -g or --global flags are provided.

  "install": "make install"

scripts

This is an array of scripts that will be installed into a project.

  "scripts": ["script.sh"]

files (optional)

This is an array of non-script files that will be installed into a project.

  "files": ["bar.txt", "foo.txt"]

dependencies (optional)

This is a hash of dependencies. The keys are the package names, and the values are the version specifiers. If you want the latest code use 'master' in the version specifier. Otherwise, use a tagged release identifier. This works the same as bpkg install's package/version specifiers.

  "dependencies": {
    "term": "0.0.1"
  }

dependencies-dev (optional)

This is a hash of dependencies only needed during development. Like the dependencies array, the keys are the package names, and the values are the version specifiers; 'master' or a tagged release can be used as the identifier. These development dependencies are installed by adding the -d or --dev flags to the bpkg install command.

  "dependencies-dev": {
    "term": "0.0.1"
  }

commands (optional)

This is a hash of commands. The keys are the names of the commands and the values are the commands to execute in a shell. The commands can be called from the command line with bpkg run followed by the command name.

  "commands": {
    "say-hello": "echo \"Hello $1\""
  }

The commands are run with eval, which runs the command as if on the command line. Commands can contain environment variables, and supports shell features (including special parameters and shell expansions). Passed parameters (on the command line after the command name) can be accessed in the command by using $@ or $1.

$ bpkg run say-hello "Bash Package Manager"
Hello Bash Package Manager

commands-description (optional)

This is a hash of descriptions for configured commands. The keys are the names of the commands and the values are the descriptions for the specified commands. The command descriptions can be listed on the command line by providing the -l or --list flags after the bpkg run command.

  "commands-description": {
    "say-hello": "Output hello to provided name (ex: bpkg run say-hello John)"
  }

Packaging best practices

These are guidelines that we strongly encourage developers to follow.

Package exports

It's nice to have a bash package that can be used in the terminal and also be invoked as a command line function. To achieve this the exporting of your functionality should follow this pattern:

if [[ ${BASH_SOURCE[0]} != "$0" ]]; then
  export -f my_script
else
  my_script "${@}"
  exit $?
fi

This allows a user to source your script or invoke as a script.

# Running as a script
./my_script.sh some args --blah
# Sourcing the script
source my_script.sh
my_script some more args --blah

Sponsors

bpkg wouldn't be where it is today without the help of its authors, contributors, and sponsors:

  • @socketsupply (socketsupply.co)
  • @little-core-labs
  • @littlstar (littlstar.com)
  • @spotify (spotify.com)

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

Contributors

This project exists thanks to all the people who contribute. [Contribute].

Backers

Thank you to all our backers! 🙏 [Become a backer]

License

bpkg is released under the MIT license.

See file LICENSE for a more detailed description of its terms.

About

Lightweight bash package manager

www.bpkg.sh

Topics

bashbash-scriptbash-scriptingbpkginstallerinstaller-scriptpackage-managementpackage-managershellshell-scriptshell-scripts

Resources

Readme
MIT license
Activity
Custom properties

Stars

2.0k stars

Watchers

31 watching

Forks

104 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.