Add, remove, and manage different versions of web-distributed software binaries. No elevated permissions required!

A cross-platform package manager for the web!


schema-linter bintest

Add, remove, and manage different versions of web-distributed software binaries. No elevated permissions required!

Warning: This repo is still under development and has not stabilized. There may be frequent breaking changes until a 1.x release.

Package recipes are located in the webman-pkgs repo. Recipes are simple YAML files that make it easy to submit a new package. Webman locates version numbers online and installs packages from the web, so you'll always have the most up-to-date software available!

Windows (Powershell), Linux, and MacOS are supported!

Install webman by running the following command in MacOS, Linux, or Git Bash for Windows :

curl https://raw.githubusercontent.com/candrewlee14/webman/main/scripts/install.sh | sh

NOTE: Never blindly run a shell script from the internet. Please check the source shell file scripts/install.sh Alternatively, download the latest release manually.

Philosophy

I wanted a cross-platform package manager like webi with no dependencies, a nice CLI, and a simple package configuration format. I wanted a generalized version of nvm, nvm-windows, and gvm for easily switching between package versions. I wanted an easy way to install groups of packages, like the tools in modern-unix.

That's why I built webman.

All of webman's resources are located in ~/.webman. The only directory that needs to go on your system PATH is ~/.webman/bin. Simply remove the ~/.webman directory and all of webman's packages and resources will be removed.

Security is an important priority to me here. Package recipes cannot specify commands to be run, only endpoints to access. Everything is implemented in Go.

Examples

Below are examples of adding, removing, and switching with webman.

Add Software

webman add go will install the latest version of Go.

webman add [email protected] will install a specific version (0.9.1) of Zig.

webman add rg lsd zig node go [email protected] will install each of the package versions listed.

webman group add modern-unix will allow checkbox selections for adding packages in the modern-unix group.

webman add example

Run Software

webman run go will run the in-use version of Go (if installed).

webman run [email protected] --version will run a specific version (0.9.1) of Zig with the argument --version.

webman run node:npm --version will run npm --version using the in-use version of node.

Remove Software

webman remove go will allow you to select an installed version of the Go package to uninstall/

webman group remove modern-unix will allow checkbox selections for removing packages in the modern-unix group.

webman remove example

Switch to Other Versions of Software

webman switch go will allow you to select an installed version of the go package to switch to use. If rg --version previously showed 13.0.0, try running webman switch rg and selecting version 12.0.0 (after it has been installed). Running rg --version again will say 12.0.0.

Webman does version management.

webman switch example

Check Packages & Test Locally

You can create new package recipes by adding a simple recipe file in a cloned webman-pkgs directory. Check if it is in a valid format with webman dev check [WEBMAN-PKGS-DIR].

Next, webman dev bintest [NEW-PKG] -l [WEBMAN-PKGs-DIR] will do a cross-platform installation test on a package.

The package recipe format was built around making it easy to contribute new packages to webman, so if you're missing a package, go ahead and create it!

Setup

Run the script above or download the binary for your OS and architecture here.

Alternatively, if you have Go installed, run:

go install https://github.com/candrewlee14/webman@latest

Next, add ~/.webman/bin to your system PATH. If you are on Windows, use %USERPROFILE% instead of ~.

Now you're ready to use webman! Hope you enjoy :)

Updating

You can update webman at any time using webman add webman --switch.

Owner
Andrew Lee
Software Developer at InfluxData
Andrew Lee
Comments
  • Move from unpack to archiver

    Move from unpack to archiver

    Leaving as draft, bintest fails on Windows, specifically non-windows binaries.

    I checked, and this was true prior to archiver, so it's not specific to this PR, but I may as well fix it at the same time if I can.

    On WSL, after moving to archiver, bintest succeeded with a handful of packages still.

  • Add JSON schema

    Add JSON schema

    Will resolve #18

    This is a draft of the schema, you can add it to your IDE of choice that supports it. I will be adding some library that can ingest this schema and lint a given recipe via CLI as well.

    I had minimized some of the JSON to decrease whitespace noise, but JetBrains had other ideas apparently... :sweat_smile:

    Feel free to give early feedback, particularly for descriptions or if you can think of any odd validation the code does, as I've only looked through the code briefly to look for existing validation rules.

    I noticed that you only have mappings for three OS, so let me know if you also want to limit the enum for ARCH in the schema. Currently it's just a list I put together from go tool dist list, although some obvious ones like wasm could probably be safely ignored.

  • Add gitea-release strategy

    Add gitea-release strategy

    This would also require a base URL for a given Gitea instance.

    This may tie into #17 as well, since I'd imagine it would potentially get messy to add pkgs from various Gitea instances to the main pkg repo.

  • Use symlinks on windows and add doctor

    Use symlinks on windows and add doctor

    The only remaining question is how to deal with current windows setups.

    Should we build in a migration system? In this case, a one-time scan for batch files and convert them to symlinks?

  • Output broken on Windows

    Output broken on Windows

    Hi @candrewlee14 , thank you for this project.

    I have an ugly output on a Windows cmd shell (note: other apps output is managed well, even when using colors or other ANSI escape codes)

    webman

    The best option would be fix this behaviour, but imho it is acceptable to allow user to disable the colored output. Cheers, Enrico

  • Add support for Pandoc

    Add support for Pandoc

    Pandoc (https://github.com/jgm/pandoc/releases/tag/2.19.2) has a couple tricky cases that I don't think we can currently handle.

    • Different arch map for each OS
    • MacOS has universal binary, so it doesn't use arch

    I think it might be good to allow a filename_format_override and arch_map_override within each OS in os_map.

  • Add config commands

    Add config commands

    Closes #37

    webman config - Base command allows changing top-level config, currently only the refresh interval webman config remove - Remove a package repository webman config add - Add a package repository

    Part of me wants to be conservative and change add/remove to something like repo-add or another subcommand repo add But that would get a bit verbose, and I'm not sure it's worth the conservation currently.

  • [unpack] Golang pure unpack

    [unpack] Golang pure unpack

    Added support for decompressing tar.xz and tar.gz files, without exec(tar) Allows to unzip .tar files in windows

    Details

    • To decompress tar.gz the standard library is used
    • To decompress tar.xz files, github.com/ulikunitz/xz was used, which is a 100% go library, it should work on a windows installation

    test

    • Linux (tar.gz, tar.xz)
    • Windows (tar.gz)

    Curlie works on windows, although the recipe needs to be modified, please add a related pull request

  • Unable to use installation script

    Unable to use installation script

    I'm running into an error installing a amd64 linux machine. Output:

    curl https://raw.githubusercontent.com/candrewlee14/webman/main/scripts/install.sh | sh
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  9690  100  9690    0     0   126k      0 --:--:-- --:--:-- --:--:--  126k
    candrewlee14/webman info checking GitHub for latest tag
    candrewlee14/webman info found version: 0.9.0 for v0.9.0/linux/x86_64
    Refreshing package recipes for "webman"...
    rename /home/candrewlee14/.webman/tmp/recipes/webman-pkgs-main /home/candrewlee14/.webman/recipes/webman: no such file or directory
    webman: open /home/candrewlee14/.webman/recipes/webman/pkgs/webman.webman-pkg.yml: no such file or directory
    Not all packages installed successfully
    

    @jolheiser I think this has to do with the multi-repo configuration.

  • Add powershell installer

    Add powershell installer

    I am by no means a Powershell developer, but I was able to get something that works. The community can help improve if they run into any problems, but this is (hopefully) a good first pass.

    Note that the screenshot points at my branch in my fork for testing, but I've adjusted it in the README. install

    Closes #16

  • Alternate package repos

    Alternate package repos

    At this point I fear this PR is rather large, so quick pretext that I am totally fine if you don't want all (or any) of this to be merged. Resolves #17

    Some notable things this PR does:

    1. Creates a config.yaml in the base .webman dir, which is used to control things like refresh interval and package repositories
      1. By default the refresh interval is set to 6h (same as current), and a single package repo is written (webman-pkgs)
      2. Recipes are moved one layer deeper and are identified by their name in the config.
        e.g. the default lives in ~/.webman/recipes/webman now
      3. When any commands are processed, they now look through package repos to find a match, meaning the first to match wins.
    2. I ran gofumpt, which is why some of the formatting is changed. gofumpt is just a stricter gofmt, so they are compatible.
    3. I removed the refresh files and am instead simply checking the directory modtime. Since we remove the entire dir, the modtime is effectively the same as the last time we "refreshed".
    4. I removed some funcs/unnecessary syntax as I noticed them.

    For me, personally, the reason for wanting this is because I have some homegrown projects that I would love to benefit from the UX simplicity of webman, but I'm not sure make sense to add to the central webman-pkgs repo.

    As well, this allows me to potentially use this in a work setting where, again, the tools used may not make sense to add to the central location.


    Currently there aren't any dedicated tests, so I will report back after using this for a while and let you know if I run into any hiccups. (And also when I find time I will try to write some tests)

  • Symlink installation dirs somewhere

    Symlink installation dirs somewhere

    Ironically both are editors, but nvim and helix both have issues with symlinks (at least on Windows) where they cannot find their runtime required files.

    One potential fix is to also symlink their install from pkg/helix/helix-22.08.1 (example) to pkg\helix\current or perhaps pkg\helix\using .

    At least with Helix you are able to override its runtime path, although I'm not sure about nvim.

  • Back to create windows cmd script if symlink creation fails

    Back to create windows cmd script if symlink creation fails

    This change allows you to use webman even if developer mode has not been enabled in windows:

    if symlink creation fails, fallbacks to creating a script named ${executable name minus extension}.cmd.

    Could impact #53 (and maybe #11) so, if you were interested in this, it would be necessary to correct the "Windows Symlink check" which I have left untouched right now.

  • New latest strategy

    New latest strategy

    Hi, i would like to use webman to install non-github/gitea software, eg Maven. To do this I created a new latest strategy (fixed, maybe you can find a better name). An example of a working recipe definition is in testcases/pkgs/maven.webman-pkg.yml.

    go run main.go -l testcases add maven

    Cheers, Enrico

  • Refactors

    Refactors

    • Add some comments
    • Move some code to other files for clarity
    • Add group schema
    • Fix stem parsing for packages with hyphens in their name

    Open to feedback while I work on it! 🙂

  • Robustly handle package schema breaking changes

    Robustly handle package schema breaking changes

    When package schema changes without backwards compatibility, webman should be able to notify the user that webman is out of date, and then install the package from a commit of webman-pkgs that was compatible (instead of erroring out trying to install an invalid new schema).

    This could be something like a compatibility.yml in the root of webman-pkgs:

    webman_versions:
      - v0.8.0: [last compatible webman-pkgs commit SHA]
      - v0.9.0: [last compatible webman-pkgs commit SHA]
    

    and an unspecified end would use the latest commit.

A kubernetes plugin which enables dynamically add or remove GPU resources for a running Pod
A kubernetes plugin which enables dynamically add or remove GPU resources for a running Pod

GPU Mounter GPU Mounter is a kubernetes plugin which enables add or remove GPU resources for running Pods. This Introduction(In Chinese) is recommende

Jan 5, 2023
Go version manager. Super simple tool to install and manage Go versions. Install go without root. Gobrew doesn't require shell rehash.

gobrew Go version manager Install or update With curl $ curl -sLk https://git.io/gobrew | sh - or with go $ go get -u github.com/kevincobain2000/gobre

Jan 5, 2023
Manage Go Versions/Projects/Dependencies
Manage Go Versions/Projects/Dependencies

rodent rodent is a shell (bash) application which: Manages multiple versions of Go. Allows you to test/build your projects against multiple Go release

Dec 13, 2022
A software which can manage and analysis your hands played on GGPoker and Natural8

PokerManager PokerManagr is a software which can manage and analysis your hands played on GGPoker and Natural8 Related Installation Web server : Nginx

Apr 20, 2022
Shell script to download and set GO environmental paths to allow multiple versions.
Shell script to download and set GO environmental paths to allow multiple versions.

gobrew gobrew lets you easily switch between multiple versions of go. It is based on rbenv and pyenv. Installation The automatic installer You can ins

Nov 3, 2022
Basic Kubernetes operator that have multiple versions in CRD. This operator can be used to experiment and understand Operator/CRD behaviors.

add-operator Basic Kubernetes operator that have multiple versions in CRD. This operator can be used to experiment and understand Operator/CRD behavio

Dec 15, 2021
Dockpin - A tool for pinning Docker image and apt package versions

Dockpin Install dockpin with: go install github.com/Jille/dockpin@latest Dockpin

Dec 20, 2022
Seatsserver - Combined frontend and backend to serve HTML versions of seats
Seatsserver - Combined frontend and backend to serve HTML versions of seats

seatsserver Combined frontend and backend to serve HTML versions of github.com/s

Jan 28, 2022
Terraform Provider for Latest HashiCorp Product Versions

terraform-provider-hashicorpversions The purpose of this Terraform provider is to get the latest semantic version of any of the suite of HashiCorp too

May 16, 2022
A tool that scans archives to check for vulnerable log4j versions

log4j-sniffer log4j-sniffer crawls for all instances of log4j that are earlier t

Dec 14, 2022
Output all versions of a local git repo, which could be used as test data for your ML program.

gitwalker Output all versions of a local git repo, which could be used as test data for your ML program. Notice This program is under development. Cur

Dec 27, 2021
This action prints "true" if image is required to update based on the base image update.

container-image-updater This action prints "true" if image is required to update based on the base image update. Inputs Name Type Description base-ima

Apr 15, 2022
Small and easy server for web-hooks to deploy software on push from gitlab/github/hg and so on

Deployment mini-service This mini web-server is made to deploy your code without yaml-files headache. If you just need to update your code somewhere a

Dec 4, 2022
The missing package manager for golang binaries (its homebrew for "go install")

Bingo: The missing package manager for golang binaries (its homebrew for "go install") Do you love the simplicity of being able to download & compile

Oct 31, 2022
Use this program to embed sh scripts in binaries

sh2bin Use this program to embed sh scripts in binaries. Feel free to fork this

Jan 4, 2023
Automatic-Update-Launcher - A general purpose updater for updating program binaries when update folder exists
Automatic-Update-Launcher - A general purpose updater for updating program binaries when update folder exists

Automatic Update Launcher A general purpose updater for updating (web) applicati

Jun 27, 2022
An open-source, distributed, cloud-native CD (Continuous Delivery) product designed for developersAn open-source, distributed, cloud-native CD (Continuous Delivery) product designed for developers
An open-source, distributed, cloud-native CD (Continuous Delivery) product designed for developersAn open-source, distributed, cloud-native CD (Continuous Delivery) product designed for developers

Developer-oriented Continuous Delivery Product ⁣ English | 简体中文 Table of Contents Zadig Table of Contents What is Zadig Quick start How to use? How to

Oct 19, 2021
"go build" wrapper to add version info to Golang applications

govvv The simple Go binary versioning tool that wraps the go build command. Stop worrying about -ldflags and go get github.com/ahmetb/govvv now. Build

Dec 16, 2022
"go build" wrapper to add version info to Golang applications

govvv The simple Go binary versioning tool that wraps the go build command. Stop worrying about -ldflags and go get github.com/ahmetb/govvv now. Build

Dec 16, 2022