I developed a tool PowerSession using CSharp and wanted to make it easy to be installed and used. The way of distributing command line tools in CSharp community is not as easy as it in Python/Node/Go or whichever has an official support to publish a command line tool, mostly a executable binary, using the language default package manager. Nuget is what you can use to package your artifact and publish to several nuget sources, but the lack of providing an executable entrypoint for a pacakge like other pacakge managers makes it less useful in this case.
After some research, I found Scoop an easy and powerful platform to distribute a command line tool:
- Easy to setup - all metadata are based on simple JSON
- Builtin version checker and updater
- Easy to publish - Github based buckets
Checkout the wiki for more information.
The first step is to create a Manifest for you software, something like this. Once you have the JSON, you can install the tool by running:
> scoop install ./PowerSession.json
But this is not we want - that means we have to host the JSON somewhere and you won't have the updater functionality because Scoop doesn't know where to check the package metadata. What we want is to install our own tool just like installing other well-known tool:
> scoop install PowerSession
Here comes the bucket.
One more step needs to be done is to add your JSON to the official bucket, by simply raising a PR to the repository: ScoopInstaller/Main
Once it's approved and merged, your tool will be available for everyone to install and use easily.
PS C:\Users\i> scoop info powersessionName: powersessionDescription: Powershell session recorder.Version: 1.2.0Website: https://github.com/ibigbug/PowerSessionLicense: MIT (https://spdx.org/licenses/MIT.html)Manifest:C:\Users\i\scoop\buckets\main\bucket\powersession.jsonInstalled:C:\Users\i\scoop\apps\powersession\1.2.0Binaries:PowerSession.exe
To create a Manifest is quite well documented in the wiki, it was just how to make a new software available in the default bucket which took me a while to figure out. Hope this will help you :)