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