@@ -181,6 +181,73 @@ At this point in Emacs you'll see this pop up:
181
181
182
182
For other editors connect to the given port manually.
183
183
184
+ ## Writing custom steps
185
+
186
+ Launchpad performs a number of steps, currently these are
187
+
188
+ - ` read-deps-edn ` : Read in ` deps.edn ` , ` ~/.clojure/deps.edn ` , and ` deps.local.edn `
189
+ - ` handle-cli-args ` : Parse CLI arguments
190
+ - ` get-nrepl-port ` : Figure out the nREPL port, either from a CLI argument or use a free port
191
+ - ` get-nrepl-bind ` : Figure out which device to bind to
192
+ - ` compute-middleware ` : Figure out the nREPL middleware to use (optionally CIDER, refactor-nrepl, and whatever else is configured)
193
+ - ` compute-extra-deps ` : Add additional dependencies if needed, like nREPL, CIDER, refactor-nrepl
194
+ - ` include-hot-reload-deps ` : Add ` lambdaisland.classpath ` and set it up for hot reloading deps.edn
195
+ - ` include-launchpad-deps ` : Add launchpad itself as a dependency, since it contains runtime helpers for dotenv and shadow-cljs handling
196
+ - ` watch-dotenv ` : Setup watch handlers to hot-reload ` .env ` and ` .env.local `
197
+ - ` start-shadow-build ` : Start the shadow-cljs build process, if necessary
198
+ - ` maybe-go ` : Add ` (user/go) ` to the list of code to run on startup
199
+ - ` disable-stack-trace-elision ` : Add ` -XX:-OmitStackTraceInFastThrow ` to the JVM flags
200
+ - ` inject-aliases-as-property ` : Add ` -Dlambdaisland.launchpad.aliases ` as a JVM flag, so we know at runtime which aliases we started with
201
+ - ` include-watcher ` : Start up the main watcher which will handle deps.edn/.env watching
202
+ - ` run-nrepl-server ` : Add startup code to start nREPL
203
+ - ` print-summary ` : Print an overview of aliases and extra dependencies that are being included
204
+ - ` start-process ` : This is where we actually start Clojure
205
+ - ` wait-for-nrepl ` : Wait for nREPL to be available
206
+ - ` maybe-connect-emacs ` : Instruct Emacs to connect to nREPL
207
+
208
+ Each steps works on a context (` ctx ` ) map, mostly what you do is add stuff into
209
+ that context, which gets used to construct the final clojure/JVM startup
210
+ command. These are some of the keys in the context that you can read, set, or
211
+ update:
212
+
213
+ - ` :java-args ` : sequence of JVM arguments, without the leading ` -J `
214
+ - ` :requires ` : namespaces to load (sequence of symbols)
215
+ - ` :eval-forms ` : code to evaluate (sequence of forms)
216
+ - ` :options ` : the result of parsing command line flags (map)
217
+ - ` :watch-handlers ` : map from file path to filesystem change handler function
218
+ - ` :extra-deps ` : additional dependencies to load, map from artifact name (symbol), to deps.edn coordinates map
219
+ - ` :env ` : environment variables to set (gets populated with ` .env ` /` .env.local ` )
220
+ - ` :middleware ` : nREPL middleware to include, sequence of fully qualified symbols
221
+ - ` :shadow-cljs/build-ids ` : shadow-cljs build-ids to start
222
+ - ` :shadow-cljs/connect-ids ` : shadow-cljs build-ids to connect a REPL to
223
+ - ` :clojure-process ` : the Java Process object, once Clojure has started
224
+ - ` :nrepl-port ` : nREPL TCP port
225
+ - ` :nrepl-bind ` : nREPL device IP
226
+ - ` :aliases ` : deps.edn aliases in use
227
+ - ` :main-opts ` : CLI command line options (seq of string)
228
+ - ` :deps-edn ` : merged deps.edn map
229
+ - ` :paths ` : paths to add to the classpath
230
+
231
+ Most of the time you want to add extra steps either right before, or right after
232
+ ` start-process ` . The vars ` before-steps ` and ` after-steps ` are useful for that.
233
+
234
+ ``` clj
235
+ (require '[lambdaisland.launchpad :as launchpad]
236
+ '[babashka.process :refer [process]])
237
+
238
+ (defn npm-install [ctx]
239
+ (process '[npm install] {:out :inherit
240
+ :err :inherit })
241
+ ctx )
242
+
243
+ (launchpad/main
244
+ {:steps
245
+ (concat launchpad/before-steps
246
+ [npm-install
247
+ launchpad/start-process]
248
+ launchpad/after-steps)})
249
+ ```
250
+
184
251
<!-- opencollective -->
185
252
## Lambda Island Open Source
186
253
0 commit comments