I’m extremely excited to be kicking off discussions for a cross-platform package management system (client and server) for the Rhinoceros platform. I had many an interesting chat whilst in Barcelona about scenarios that I could see directly benefitting from such a system. Below is a slightly sanitised version of the notes I took during the conference. This is only a starting point, everything is up for discussion at this stage. I’m kicking things off in Serengeti to involve as many people as possible (within reason) – so please give us your thoughts.
But, before I start blabbering on, I should probably introduce myself quickly for the benefit of those of you that I haven’t yet had chance to meet. I’m Will Pearson. I’m from the UK and work in London as a structural engineer/computational designer/software developer. I’m delighted to have recently joined the McNeel team (albeit in a limited capacity) to work specifically on this project. I’m fascinated by the processes involved in developing software, from IDE to CI, so a package manager is right up my street! I’ve also dabbled with a variety of modern languages, each with their own solutions to installing dependancies, and will try to use this to approach this project from a holistic perspective.
So, back to the discussion at hand, what ‘packages’ could we potentially ‘manage’?
- Rhino/Grasshopper plugins*
- Rhino models
- Rhino templates
- Grasshopper definitions
- GH user objects and clusters
- RhinoPython/GhPython scripts
- Rhino blocks
- materials, environments and textures
- anything else?
* As I see it, small to medium sized Rhino/GH plugins should be the main priority, e.g. the type that currently exits on Food4Rhino and perhaps slightly larger ones, looking for a more tightly integrated delivery system. The current problem with these plugins is that installing them is either a manual task, or the onus is on the developer to roll their own installation system which can lead to plugins scattered across the filesystem. We need a system that takes the user from discovery through to use in one simple, common step.
Building on top of this central goal, the following hopes and/or dreams are of slightly more specific nature, mostly stemming from discussions with other developers/users in Barcelona:
- option to automatically install Grasshopper plugins when missing dependancies are detected on loading a definition (in the case of old definitions, the ability to rollback plugin versions)
- automated configuration of plugins, templates, etc. when provisioning new machines or starting new projects (perhaps using something akin to Pip’s requirements.txt or RubyGem’s Gemfile)
- internal distribution of tools and files
- loading multiple versions of Grasshopper plugins to make it easier to load new and old definitions
- integration with the current Rhino Installer Engine
These are all worthy of consideration. My personal feeling is that this system should be highly flexible and configurable, allowing for scenarios such as:
- configuration of local package folder(s) (system vs. user vs. network) to reduce disruption of existing workflows
- the possibility for self-hosted servers, allowing private repositories to exist behind company firewalls
- the potential to do things (within reason) that we hadn’t even considered
There should also be several interfaces:
- Rhino command line
- standalone command line
- Rhino UI (to cover GH also)
- web gallery (re-purpose Food4Rhino to work more like rubygems.org (for example), perhaps with protocol handlers for one-click installation? (Nice idea @brian :))
The packages themselves should have a simple yet flexible manifest spec containing all the usual suspects metadata-wise (id, version, author, pre-/post-install scripts, etc.) as well as dependancy information (including, dependancies from other sources, such as NuGet, perhaps).
A couple of general questions:
- Could and/or should it work with the Zoo and other licensing systems?
- Should the McNeel repository be moderated (Food4Rhino current operates an approval system AFAIK)
- Should this link in some way to http://www.rhino3d.com/resources/?
Some “nice-to-haves” that I’m personally a little bit excited about:
- exposure of NuGet feed to allow plugins with APIs to be easily referenced within .NET projects
- allow specification of VCS revision (i.e. git SHA) in place of version for open source projects that (a) do not require compiling, i.e. models, scripts, definitions, or (b) hook into a common continuous integration system, or © could be built at install-time if development dependancies are satisfied.
- ability to group packages (see base-devel on Arch Linux)
Finally, below are just a few reference package management projects:
- NuGet
- PyPi
- RubyGems
- NPM
- OneGet
- https://github.com/OneGet/oneget
- errrr, powershell on Mac… (pash to the rescue?)
- Yum
- APT
If you have any thoughts on the above, perhaps a scenario that you think could be solved by something I’ve said, please reply and let’s get this discussion rolling. I’m hoping there are others out there who are as excited about this as we are!
P.S. I’m also accepting codename suggestions
P.P.S. Here’s a link to the meta-issue over on youtrack: http://mcneel.myjetbrains.com/youtrack/issue/RH-29026