How to provide latest paclet version

Assuming all we want to use is GitHub, the best way does not exist but there are couple of alternatives used by folks around.

Regardless of the final installation method it is safe to say that it is beneficial to first have a .paclet file created (search around for PackPaclet) and, depending on the method, attached to a GitHub release.


TLDR I am using ResourceFunction["GitHubInstall"][ author_, name_ ]

1.1. install.m script

You can add an install.m script in your repository. User is supposed to call Import @ "url/to/install.m" and the installation procedure does whatever you want it to do.

Examples:

  • https://github.com/kubaPod/MPM#installation

  • https://github.com/FeynCalc/feyncalc/wiki/Installation

Pros:

  • flexible installation routine

Cons:

  • ugly url to type by the user: https://raw.githubusercontent.com/`username`/`pacletName`/master/install.m, sure it can be copied but the fewer steps the better.

1.2 ResourceFunction installation script

Presented in Szabolcs' MaTeX where the installation script is a ResourceFunction:

Examples:

  • https://github.com/szhorvat/MaTeX#installation
  • FEMAddOnsInstall

Pros:

  • flexible installation routine
  • simple call e.g. ResourceFunction["MyPacletInstall"]

Cons:

  • The resource function needs to be verified by WRI before it is available

2. GitHub hosted PacletSite

You just build .paclet to your repository and update PacletSite.info.

Example:

  • Carl Woll's GraphicsInformation

Pros:

  • once paclet site is added user can quickly check for updates etc.
  • all WRI built-in functions based deploy-release-install

Cons:

  • Adds a lot of weight to your repository since binary .paclets need to be kept there. For this reason probably not the best for large or frequently updated projects.

3.1. A paclet installation manager

The idea is to install a 'paclet manager' once and it should handle standard Github released packages.

Examples

  • MPM`

    I created a simple installation manager MPM`: https://github.com/kubaPod/MPM

    Once you install it (using install.m :)) you can just call MPMInstall["szhorvat", "MaTeX"]. Check more examples in the GitHub wiki or this answer

        Import["https://raw.githubusercontent.com/kubapod/mpm/master/install.m"] (*only once*)
        Needs @ "MPM`"
        MPMInstall["kubapod", "devtools"]
    
  • PDInstallPaclet

    Alternatively take a look at b3m2a1's PDInstallPaclet

Pros:

  • easy to use
  • full of utilities

Cons:

  • you need to trust the source of the manager like MPM (otoh with plain text .m it is easy to inspect)
  • unless standards are expanded it only does paclet install and any fancy setup needs to be run separately

3.2. ResourceFunction["GitHubInstall"]

I pushed a reduced version of the MPMInstall to the function repository. It is straightforward to use:

ResourceFunction["GitHubInstall"]["szhorvat", "matex"]

see ResourceFunction["GitHubInstall", "DocumentationNotebook"] for more information.

Cons and Pros the same as with 3.1 + it is easier to use.


You can have a look at the resource functions FEMAddOnsInstall or MaTexInstall that are both interfacing paclets hosted on GitHub. Both packages have code to automatically find the latest asset and install it.

This is what it looks like in practice:

ResourceFunction["FEMAddOnsInstall"][]
(* PacletObject["FEMAddOns", "1.3.2", <> ] *)

That's it. No URLs, Paclet manger stuff or any other monkey business, nothing. You do not even need to visit a web page. Just open M- and install the paclet. It can not get easier than that.

Update Info: For the first use of a ResourceFunction you need to be log into your account. That is a possible disadvantage I have been made aware of. At the time of writing the answer I was not aware of this.

Have a look at the code provided in the resource functions. Note that you need to write and get the resource function approved only once (copy it form either one of the two mentioned pages). Since there are already two functions that do this, I think yours will be approved too. You can then update your github repo to your hearts content.