Creating a Grasshopper Plug-In Package

The Package Manager is a new feature in Rhino 7 WIP. It makes it easier to discover, install and manage Grasshopper plug-ins from within Rhino. This guide will describe how to create a package from a Grasshopper plug-in that can be published to the package server.

Note
The package manager is cross-platform. The examples below are for Windows. For Mac, replace the path to the Yak CLI tool with "/Applications/Rhino 7.app/Contents/Resources/bin/yak".

First, let’s assume you have a folder on your computer which contains all the files that you would like to distribute in your package. Something like this…

C:\Users\Bozo\dist
├── Marmoset.gha
├── Marmoset.dll
├── icon.png
└── misc\
├── README.md
└── LICENSE.txt


We’re going to use the Yak CLI tool to create the package, so open up a Command Prompt and navigate to the directory above.

> cd C:\Users\Bozo\dist


Now, we need a manifest.yml file! You can easily create your own by studying the Manifest Reference Guide. Alternatively, you can use the spec command to generate a skeleton file. We’ll do the latter here.

> "C:\Program Files\Rhino 7\System\Yak.exe" spec

Inspecting content: Marmoset.gha

---
name: marmoset
version: 1.0.0
authors:
- Park Ranger
description: >
This plug-in does something. I'm not really sure exactly what it's supposed to
do, but it does it better than any other plug-in.
url: https://example.com

Saved to C:\Users\Bozo\dist\manifest.yml


The spec command takes a look at the current directory and, if present, will glean useful information from the .gha assembly and use it generate a manifest.yml with name, version, authors, etc. pre-populated. If you haven’t added this information, then placeholders will be used.

Note
The spec command is useful for generating the manifest.yml file initially. Once you have one, keep it with your project and update it for each release.

Open the manifest file with your favourite editor and fill in the gaps.

Afterwards, you should have something that looks a little like this…

---
name: marmoset
version: 1.0.0
authors:
- Park Ranger
description: >
This plug-in does something. I'm not really sure exactly what it's supposed to
do, but it does it better than any other plug-in.
url: https://example.com
icon: icon.png
keywords:
- mammal


Now that we have a manifest file, we can build the package!

> "C:\Program Files\Rhino 7\System\Yak.exe" build

Building package from contents of C:\Users\Bozo\dist

Found manifest.yml for package: marmoset (1.0.0)
Inspecting content: Marmoset.gha
Creating marmoset-1.0.0-rh6_18-any.yak

---
name: marmoset
version: 1.0.0
authors:
- Will Pearson
description: >
This plug-in does something. I'm not really sure exactly what it's supposed to
do, but it does it better than any other plug-in.
url: example.com
keywords:
- mammal
- guid:c9beedb9-07ec-4974-a0a2-44670ddb17e4

C:\Users\Bozo\dist\marmoset-1.0.0-rh6_18-any.yak
├── Marmoset.dll
├── Marmoset.gha
├── manifest.yml
├── misc\LICENSE.txt
└── misc\README.md

Note
The filename includes a “distribution tag” (in this case rh6_18-any). The first part, rh6_18, is inferred from the version of Grasshopper.dll or Rhinocommon.dll that is referenced in the plug-in project. The second part, any, refers to the platform that the plug-in is intended for. To build a platform-specfic package, run the build command again with the --platform <platform> argument, where <platform> can be either win or mac.
Warning
Currently, if you publish a package with a rh6* distribution tag, it will not be installable for Rhino 7. If your plug-in also works in Rhino 7, please mark it as compatible by copying the .yak file, updating the distribution tag part of the filename (i.e. rh6_18rh7_0) and pushing both to the package server.
Note
You might notice your plug-in’s GUID lurking in the keywords. More information on how this is used can be found in the “Package Restore in Grasshopper” guide.

Congratulations! 🙌 You’ve just created a package for your Grasshopper plug-in.

## Next Steps

Now that you’ve created a package, push it to the package server to make it available in the package manager!