Skip to content
This repository was archived by the owner on Aug 23, 2018. It is now read-only.

Commit 8c96f11

Browse files
author
Richard Feldman
committed
Add PUBLISHING.md
1 parent 458b2f3 commit 8c96f11

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed

installers/npm/.npmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
README.md
2+
PUBLISHING.md
23
.gitignore
34
.git

installers/npm/PUBLISHING.md

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
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

Comments
 (0)