@@ -0,0 +1,171 @@
1+# Publishing a new release
3+A new version of Elm came out. Huzzah! Here's how to update the `npm` installer.
5+## 1. Create tarballs of binaries
7+You can find a list of what binaries we'll need to tar up in `index.js`.
13+ "https://github.com/elm/compiler/releases/download/" +
17+module.exports = binwrap({
20+ "darwin-x64": root + "mac.tar.gz",
21+ "win32-x64": root + "windows.tar.gz",
22+ "win32-ia32": root + "windows.tar.gz",
23+ "linux-x64": root + "linux.tar.gz"
28+If this is the end of your `index.js`, you'll need to create these files:
30+1. `binaries-for-mac.tar.gz`
31+2. `binaries-for-windows.tar.gz`
32+3. `binaries-for-linux.tar.gz`
34+Each of these tarballs should have **only the Elm binary** inside them - no
37+So create them by making a directory, putting all the binaries in it, `cd`-ing
38+into that directory, and then running something like this:
41+$ tar cvzf binaries-for-linux.tar.gz elm
44+Make sure each tarball contains all the binaries listed in that `binaries:` list
45+in `index.js`. (The Windows ones should have `.exe` at the end; `binwrap`
46+expects that they will, for Windows only.)
48+## 2. Update the `bin/` binary wrappers
50+Inside the npm installer's `bin/` directory, there should be a file for each of
51+the binaries that will be included in this release.
53+Each of these must be executable! If you're not sure whether they are,
54+run `chmod +x` on them just to be sure.
56+Their paths must also must all be listed in `package.json` in two places:
58+1. The `"files":` field
61+If the executables are the same as they were for the last release, great!
62+You can proceed to the next step. If any binaries were removed, make sure to
63+remove them from these lists!
65+## 3. Update `package.json` for a beta release
67+In `package.json`, bump the version to the next applicable release, and add
68+a `"-beta"` suffix to it.
70+For example, if it was on `"0.18.0"` you might bump it to `"0.19.0-beta"`.
71+The version number should match the release of Elm, such that if people do
72+`npm install elm@0.19.0@beta` they get what they would expect.
74+## 4. Tag the beta release
76+Commit this change and tag it with the name of the release **without** the
77+`-beta` suffix. (We will overwrite this tag later.)
83+$ git push origin 0.19.0
86+Now this tag should exist on GitHub, allowing us to upload binaries to it.
90+Visit the [Create a New Release](https://github.com/elm-lang/elm-platform/releases/new)
91+page and use the `Tag version` dropdown to select the tag you just pushed. Give
92+it a title like `0.19.0`. Don't mention the `-beta` in it. The "beta" concept
95+Upload the tarballs you created in step 1.
97+## 6. Publish beta release
99+Run this to publish the beta release. The `--tag beta` is **crucial** here.
100+Without it, `npm` will by default publish a new top-level release, which would
101+mean that what you just published would become what everyone gets when they
102+`npm install -g elm` without any additional qualifiers.
105+$ npm publish --tag beta
108+Afterwards you should be able to do `npm info elm | less` and see something
109+like this in the JSON:
112+'dist-tags': { latest: '0.18.0', beta: '0.19.0-beta' }
115+If you messed this up, and the `latest` tag now points to the beta you just
116+published, don't panic - it's fixable! `dist-tags` can always be modified after
117+the fact. Read up on `npm` [dist-tags](https://docs.npmjs.com/cli/dist-tag)
118+to learn how to fix things.
120+## 7. Verify beta installer
122+Make an empty directory and run `npm init` inside it.
127+$ npm install elm@beta --ignore-scripts
130+This should succeed with an exit code of `0`.
131+If it did, look in `node_modules/.bin/` for the binaries you expect.
132+They should be present, and they should also work as expected when you run them.
133+Because you installed them with `--ignore-scripts`, the first thing they should
134+do is to download themselves and then execute whatever command you requested
135+(e.g. `node_modules/.bin/elm make Main.elm`). If you run the same command a
136+second time, it should run faster because it doesn't have to download the binary
139+Now try it again with `--ignore-scripts` turned off:
143+$ npm install elm@beta --ignore-scripts=false
146+This time it should download the binaries during the installation phase. Once
147+again you should be able to run the binaries from `node_modules/.bin/`, and
148+this time they should be fast from the first run because they're already
151+## 8. Publish for real
153+It's a good idea to ask others to try out the beta installer before doing this!
154+Especially on multiple operating systems.
156+To publish the real version:
158+1. Edit `package.json` to remove the `-beta` suffix from the version.
159+2. Commit that change and push it.
160+3. Use `git tag --force` to overwrite the previous tag (e.g. `0.19.0` - whatever you used before).
161+4. Force push the tag, e.g. `git push origin 0.19.0 --force-with-lease`.
164+You're done! Now whenever anyone does `npm install -g elm` they'll get the
165+version you just uploaded.
167+The reason we only used the `-beta` suffix for `npm` was so that when we ran
168+tests on the beta version, it was all against the same (non-beta) URLs we'd end
169+up using for the real version. This means there's no opportunity for us to
170+introduce some sort of mismatch between the beta that we verified and the real