@@ -0,0 +1,167 @@
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`.
12+var root = "https://github.com/elm-lang/elm-platform/releases/download/" + binVersion + "-exp/elm-platform";
14+module.exports = binwrap({
15+ binaries: ["elm", "elm-make", "elm-repl", "elm-reactor", "elm-package"],
17+ "darwin-x64": root + "-macos.tar.gz",
18+ "win32-x64": root + "-windows.tar.gz",
19+ "win32-ia32": root + "-windows.tar.gz",
20+ "linux-x64": root + "-linux-64bit.tar.gz"
25+If this is the end of your `index.js`, you'll need to create these files:
27+1. `elm-platform-macos.tar.gz`
28+2. `elm-platform-windows.tar.gz`
29+3. `elm-platform-linux-64bit.tar.gz`
31+Each of these tarballs should have **only binaries** inside them - no directories!
33+So create them by making a directory, putting all the binaries in it, `cd`-ing
34+into that directory, and then running something like this:
37+$ tar cvzf elm-platform-linux-64bit.tar.gz *
40+Make sure each tarball contains all the binaries listed in that `binaries:` list
41+in `index.js`. (The Windows ones should have `.exe` at the end; `binwrap`
42+expects that they will, for Windows only.)
44+## 2. Update the `bin/` binary wrappers
46+Inside the npm installer's `bin/` directory, there should be a file for each of
47+the binaries that will be included in this release.
49+Each of these must be executable! If you're not sure whether they are,
50+run `chmod +x` on them just to be sure.
52+Their paths must also must all be listed in `package.json` in two places:
54+1. The `"files":` field
57+If the executables are the same as they were for the last release, great!
58+You can proceed to the next step. If any binaries were removed, make sure to
59+remove them from these lists!
61+## 3. Update `package.json` for a beta release
63+In `package.json`, bump the version to the next applicable release, and add
64+a `"-beta"` suffix to it.
66+For example, if it was on `"0.18.0"` you might bump it to `"0.19.0-beta"`.
67+The version number should match the release of Elm, such that if people do
68+`npm install elm@0.19.0@beta` they get what they would expect.
70+## 4. Tag the beta release
72+Commit this change and tag it with the name of the release **without** the
73+`-beta` suffix. (We will overwrite this tag later.)
79+$ git push origin 0.19.0
82+Now this tag should exist on GitHub, allowing us to upload binaries to it.
86+Visit the [Create a New Release](https://github.com/elm-lang/elm-platform/releases/new)
87+page and use the `Tag version` dropdown to select the tag you just pushed. Give
88+it a title like `0.19.0`. Don't mention the `-beta` in it. The "beta" concept
91+Upload the tarballs you created in step 1.
93+## 6. Publish beta release
95+Run this to publish the beta release. The `--tag beta` is **crucial** here.
96+Without it, `npm` will by default publish a new top-level release, which would
97+mean that what you just published would become what everyone gets when they
98+`npm install -g elm` without any additional qualifiers.
101+$ npm publish --tag beta
104+Afterwards you should be able to do `npm info elm | less` and see something
105+like this in the JSON:
108+'dist-tags': { latest: '0.18.0', beta: '0.19.0-beta' }
111+If you messed this up, and the `latest` tag now points to the beta you just
112+published, don't panic - it's fixable! `dist-tags` can always be modified after
113+the fact. Read up on `npm` [dist-tags](https://docs.npmjs.com/cli/dist-tag)
114+to learn how to fix things.
116+## 7. Verify beta installer
118+Make an empty directory and run `npm init` inside it.
123+$ npm install elm@beta --ignore-scripts
126+This should succeed with an exit code of `0`.
127+If it did, look in `node_modules/.bin/` for the binaries you expect.
128+They should be present, and they should also work as expected when you run them.
129+Because you installed them with `--ignore-scripts`, the first thing they should
130+do is to download themselves and then execute whatever command you requested
131+(e.g. `node_modules/.bin/elm make Main.elm`). If you run the same command a
132+second time, it should run faster because it doesn't have to download the binary
135+Now try it again with `--ignore-scripts` turned off:
139+$ npm install elm@beta --ignore-scripts=false
142+This time it should download the binaries during the installation phase. Once
143+again you should be able to run the binaries from `node_modules/.bin/`, and
144+this time they should be fast from the first run because they're already
147+## 8. Publish for real
149+It's a good idea to ask others to try out the beta installer before doing this!
150+Especially on multiple operating systems.
152+To publish the real version:
154+1. Edit `package.json` to remove the `-beta` suffix from the version.
155+2. Commit that change and push it.
156+3. Use `git tag --force` to overwrite the previous tag (e.g. `0.19.0` - whatever you used before).
157+4. Force push the tag, e.g. `git push origin 0.19.0 --force-with-lease`.
160+You're done! Now whenever anyone does `npm install -g elm` they'll get the
161+version you just uploaded.
163+The reason we only used the `-beta` suffix for `npm` was so that when we ran
164+tests on the beta version, it was all against the same (non-beta) URLs we'd end
165+up using for the real version. This means there's no opportunity for us to
166+introduce some sort of mismatch between the beta that we verified and the real