-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTaskfile.yml
356 lines (305 loc) · 11.8 KB
/
Taskfile.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
# yaml-language-server: $schema=https://json.schemastore.org/taskfile.json
# This file gives new contributors an easy way to get everything they need,
# assuming `cargo` and [Task](https://taskfile.dev) are installed.
# Beyond installing requirements, we generally shouldn't be using this as a
# Makefile, requiring running this to have a good dev loop — rust tools are
# independently good, and adding an intermediate layer means we're
# reimplementing things or getting in the way. Instead, this can be used to
# aggregate commands that's are currently separate; e.g. check out `test-all`.
# Some of the file may be somewhat over-engineered!
version: "3"
vars:
# Keep in sync with .vscode/extensions.json
vscode_extensions: |
budparr.language-hugo-vscode
esbenp.prettier-vscode
mitsuhiko.insta
prql-lang.prql-vscode
rust-lang.rust-analyzer
cargo_crates:
bacon cargo-audit cargo-insta cargo-release default-target mdbook
mdbook-admonish mdbook-footnote mdbook-toc wasm-bindgen-cli wasm-opt
wasm-pack
tasks:
# main installer is "setup-dev" which calls other tasks
setup-dev:
preconditions:
- sh: which clang
msg: |
🔴 Can't find `clang`, which is required to install a full development environment (we use `duckdb` in our tests, which requires it).
Please install it. On MacOS, that's
xcode-select --install
On Debian Linux, that's
apt-get update && apt-get install clang
desc: Install tools for PRQL development.
cmds:
- task: install-cargo-tools
- task: install-brew-dependencies
- task: install-maturin
- task: install-pre-commit
- task: install-npm-dependencies
# We only suggest, rather than install; we don't want to intrude (maybe
# we're being too conservative?).
- task: suggest-vscode-extensions
- pre-commit install-hooks
- cmd: |
echo "
🟢 Setup complete! ✅🚀"
silent: true
install-cargo-tools:
desc: Install cargo tools for PRQL development.
cmds:
# In CI we use `binstall`, because it's faster, and without it we can't
# even get the arm64 docker image to build within the GHA timeout. But it
# produces lots of confusing warning messages about 429 errors, I think
# because it's querying GitHub for so many packages; so we only use it for
# CI atm. If the warnings were less alarming, we could use for all
# installs.
#
# `--locked` installs from the underlying lock files (which is not the
# default...)
- |
{{ if .CI }}
task install-cargo-tools-binstall
{{ else }}
task install-cargo-tools-source
{{ end }}
- cmd: |
[ "$(which cargo-insta)" ] || echo "🔴 Can't find a binary that cargo just installed. Is the cargo bin path (generally at ~/.cargo/bin) on the \$PATH?"
silent: true
install-cargo-tools-source:
cmds:
- cargo install --locked {{.cargo_crates}}
install-cargo-tools-binstall:
cmds:
- cargo install --locked cargo-binstall
- cargo binstall -y --locked {{.cargo_crates}}
install-maturin:
desc: Install maturin.
cmds:
- python3 -m pip install -U maturin
suggest-vscode-extensions:
desc: Check and suggest VS Code extensions.
vars:
extensions:
# List extensions, or just return true if we can't find `code`.
sh: which code && code --list-extensions || true
missing_extensions: |
{{ range ( .vscode_extensions | trim | splitLines ) -}}
{{ if not (contains . $.extensions) }}❌ {{.}} {{else}}✅ {{.}} {{ end }}
{{ end -}}
status:
# If vscode isn't installed, or there are no missing extensions,
# return 0 and exit early.
- '[ ! -x "$(which code)" ] || {{ not (contains "❌" .missing_extensions)
}}'
silent: true
cmds:
- |
echo "
🟡 It looks like VS Code is installed but doesn't have all recommended extensions installed:
{{ .missing_extensions }}
Install them with:
task install-vscode-extensions
"
install-vscode-extensions:
desc: Install recommended VS Code extensions.
cmds:
- |
{{ range ( .vscode_extensions | trim | splitLines ) -}}
code --install-extension {{.}}
{{ end -}}
install-pre-commit:
# Someone might have this installed with `brew`,
# so only install if it can't be found.
status:
- which pre-commit
cmds:
- python3 -m pip install -U pre-commit
install-brew-dependencies:
status:
- which hugo
- which npm
- which python3
- which elixir
preconditions:
- sh: which brew
msg: |
🔴 Can't find `brew`, which we use to install Hugo & npm. Either install brew and re-run this, or install them directly based on:
- https://gohugo.io/getting-started/installing/
- https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
cmds:
- brew install hugo npm python3 elixir
install-npm-dependencies:
cmds:
- npm install --location=global prettier prettier-plugin-go-template
- cmd:
echo "In order to get nice auto-formatting of web code in VS Code, VS
Code requires configuration to use the system-wide install of
prettier. See
https://github.com/NiklasPor/prettier-plugin-go-template/issues/58#issuecomment-1085060511
for more info."
silent: true
build-all:
desc: Build everything.
summary: |
Build everything.
Running this isn't required when developing; it's for caching or as a reference.
cmds:
- cargo build --all-targets --all-features
- cargo build --all-targets --all-features --target=wasm32-unknown-unknown
- task: build-web
test-all:
desc: Test everything, accepting snapshots.
summary: |
Test everything, accepting snapshots.
Running this isn't required when developing; it's for caching or as a reference.
cmds:
# TODO: this doesn't run the python tests. We should add them in here.
# They are run in `test-all.yaml` on GHA.
- task: test-rust
- task: build-all
- task: test-js
- pre-commit run -a
test-rust:
desc: Test all rust code, accepting snapshots.
# Commenting out the ability to watch, since Task doesn't handle watching
# big directories well: https://github.com/go-task/task/issues/985
#
# sources:
# - "**/*.rs"
# - "**/*.md"
# - "**/*.toml"
# - "**/*.lock"
# - "**/*.snap"
cmds:
# Only delete unreferenced snapshots on the default target — lots are
# excluded under wasm. Note that this will also over-delete on Windows.
- cargo insta test --accept --unreferenced=auto
- cargo insta test --accept --target=wasm32-unknown-unknown
# We build the book too, because that acts as a test
- cd web/book && mdbook build
test-rust-fast:
desc: Test prql-compiler's unit tests.
summary: |
Test prql-compiler's unit tests, including accepting snapshots.
This can be useful as an inner loop when developing, by running this on any file change.
Use `-w` to get that behavior:
task -w test-rust-fast
New or changed snapshots are accepted, and expected to be reviewed with git.
env:
RUST_BACKTRACE: 1
sources:
# I don't think we can specify this is a single glob, which would be nice.
# Ideally we want to exclude `.pending-snap` & `.snap.new` files so runs
# doesn't cause an infinite loop of other runs (though possibly mitigated
# by `--accept` and task not interrupting existing runs, so all files go
# to `.snap`s which match the generated output?).
- "prql-compiler/**/*.rs"
- "prql-compiler/**/*.snap"
cmds:
- cargo insta test --accept -p prql-compiler --lib -- --quiet
build-web:
desc: Build the website, including the book & playground.
dir: web
cmds:
- cd website && hugo --minify
- cd book && mdbook build
- mkdir -p website/public
# Copy the book into the website path, using rsync so it only copies new files
- rsync -ai --checksum --delete book/book/ website/public/book/
- task: install-playground-npm-dependencies
- cd playground && npm run build
# We place the playground app in a nested path, because we want to use
# prql-lang.org/playground with an iframe containing the playground.
# Possibly there's a more elegant way of doing this...
- rsync -ai --checksum --delete playground/build/
website/public/playground/playground/
test-js:
dir: bindings/prql-js
cmds:
- npm cit
# Currently disabled; see prql-elixir/README.md for details
test-elixir:
dir: bindings/prql-elixir
cmds:
# We could move this line into an `install` task
- mix local.hex --force
- mix deps.get --force
- mix compile
- mix test
run-website:
desc: Build & serve the static website.
dir: web/website
cmds:
- hugo server
run-web:
desc: Build & serve the website & playground.
summary:
Note that this only live-reloads the static website; and requires
rerunning to pick up playground & book changes.
dir: web/website
cmds:
- task: build-web
# Then start web server with rendering to disk, so it picks up the playground files.
- hugo server --renderToDisk
run-book:
desc: Build & serve the book.
dir: web/book
cmds:
- mdbook serve --port=3000
run-playground:
desc: Build & serve the playground.
dir: web/playground
cmds:
- task: install-playground-npm-dependencies
- npm start
run-pg:
desc: Serve the playground without building it
dir: web/playground
cmds:
- npm start
install-playground-npm-dependencies:
# Look to see if npm dependencies need to be updated
# Use task's sources/generates to see if checksums of
# node_modules directory have changed since package.json was updated
# Use `npm install --install-links=false` to install prql-js
# as the regular dependency, instead of creating a
# symlink. Refer to https://github.com/PRQL/prql/pull/1296.
desc: Check to see if package.json has changed since we ran npm install
dir: web/playground
cmds:
- npm install --install-links=false
sources:
- package.json
generates:
- node_modules/*
# The next three tasks are not used for either:
# - the Dockerfile (installing brew takes forever)
# so the Dockerfile simply installs hugo & nodejs directly
# - the "desktop setup" - it uses other tasks in the Taskfile.yml
# They remain in the Taskfile.yml as a hint if they should ever be needed
# install-brew:
# # Initially added for building Docker container
# status:
# - which brew
# cmds:
# # https://stackoverflow.com/questions/58292862/how-to-install-homebrew-on-ubuntu-inside-docker-container
# - useradd -m -s /bin/zsh linuxbrew
# - usermod -aG sudo linuxbrew
# - mkdir -p /home/linuxbrew/.linuxbrew
# - chown -R linuxbrew /home/linuxbrew/.linuxbrew
# - export HOMEBREW_INSTALL_FROM_API=1
# - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
# - chown -R $CONTAINER_USER: /home/linuxbrew/.linuxbrew
# install-hugo:
# cmds:
# # - /home/linuxbrew/.linuxbrew/bin/brew install hugo
# - curl -L https://github.com/gohugoio/hugo/releases/download/v0.91.2/hugo_0.91.2_Linux-64bit.deb -o hugo.deb
# - apt install ./hugo.deb
# install-nodejs:
# cmds:
# # - /home/linuxbrew/.linuxbrew/bin/brew install nodejs
# - curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
# - apt install -y nodejs
# - cd /app/playground/ ; npm install