Skip to content

Commit e4716cc

Browse files
authoredJan 8, 2025··
feat: add support for redirecting Wrangler to a generated config when running deploy commands (#7442)
* Do not console log wrangler output during normal fixture tests This creates a lot of unwanted logging in the console. The logging is still dumped to the console if the test times out, or if `WRANGLER_LOG=debug` is set as env var. * no need to get relative config path for calls to verifyWorkerMatchesCITag() * feat: add support for redirecting Wrangler to a generated config when running deploy commands This new feature is designed for build tools and frameworks to provide a deploy-specific configuration, which Wrangler can use instead of user configuration when running deploy commands. It is not expected that developers of Workers will need to use this feature directly. The commands that use this feature are: - `wrangler deploy` - `wrangler dev` - `wrangler versions upload` - `wrangler versions deploy` When running these commands, Wrangler will look up the directory tree from the current working directory for a file at the path `.wrangler/deploy/config.json`. This file must contain only a single JSON object of the form: ```json { "configPath": "../../path/to/wrangler.json" } ``` When this file exists Wrangler will use the `configPath` (relative to the `deploy.json` file) to find an alternative Wrangler configuration file to load and use as part of this command. When this happens Wrangler will display a warning to the user to indicate that the configuration has been redirected to a different file than the user's configuration file. A common approach that a build tool might choose to implement. - The user writes code that uses Cloudflare Workers resources, configured via a user `wrangler.toml` file. ```toml name = "my-worker" main = "src/index.ts" [[kv_namespaces]] binding = "<BINDING_NAME1>" id = "<NAMESPACE_ID1>" ``` Note that this configuration points `main` at user code entry-point. - The user runs a custom build, which might read the `wrangler.toml` to find the entry-point: ```bash > my-tool build ``` - This tool generates a `dist` directory that contains both compiled code and a new deployment configuration file, but also a `.wrangler/deploy/config.json` file that redirects Wrangler to this new deployment configuration file: ```plain - dist - index.js - wrangler.json - .wrangler - deploy - config.json ``` The `dist/wrangler.json` will contain: ```json { "name": "my-worker", "main": "./index.js", "kv_namespaces": [{ "binding": "<BINDING_NAME1>", "id": "<NAMESPACE_ID1>" }] } ``` And the `.wrangler/deploy/config.json` will contain: ```json { "configPath": "../../dist/wrangler.json" } ``` * add config redirect fixture with tests * Add config redirect support for Pages commands * refactor: compute both the actual config path and the original user's configuration * add `userConfigPath` to the `Config` type so it can be used where needed * add fixture and test for redirected config in a pages project * Do not check formatting of generated fixture files * clean node_modules for npm-import fixture before testing * fix unstable_dev tests * run more Wrangler e2e tests on safe ports * Requires that you create a `.env` file in the `packages/wrangler` directory containing: ``` CLOUDFLARE_ACCOUNT_ID=<dev-prod-account-id> CLOUDFLARE_API_TOKEN=<dev-prod-account-api-key> WRANGLER="node <path to workers-sdk/packages/wrangler/bin/wrangler.js>" WRANGLER_IMPORT="<path to /workers-sdk/packages/wrangler/wrangler-dist/cli.js>" ```` * correctly configure python workers when no command line script is provided * test: ensure that `pages functions build-env` command outputs correct relative pages_build_output_dir path * Improve error message when deploy/config.json is not valid * Complete jsdoc description * Update jsdocs to note that the result of `resolveWranglerConfigPath()` contains absolute paths. * PR feedback * rename `useRedirect` to `useRedirectIfAvailable` * Rename command definition behaviour from "useConfigRedirect" to "useConfigRedirectIfAvailable" * Add clarifying comment * Do not store package-lock.json for import-npm fixture This fixture does not need a package lockfile to work. * Remove unnecessary option in test
1 parent df15eb0 commit e4716cc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1788
-793
lines changed
 

‎.changeset/thin-pots-camp.md

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
---
2+
"wrangler": minor
3+
---
4+
5+
feat: add support for redirecting Wrangler to a generated config when running deploy-related commands
6+
7+
This new feature is designed for build tools and frameworks to provide a deploy-specific configuration,
8+
which Wrangler can use instead of user configuration when running deploy-related commands.
9+
It is not expected that developers of Workers will need to use this feature directly.
10+
11+
### Affected commands
12+
13+
The commands that use this feature are:
14+
15+
- `wrangler deploy`
16+
- `wrangler dev`
17+
- `wrangler versions upload`
18+
- `wrangler versions deploy`
19+
- `wrangler pages deploy`
20+
- `wrangler pages build`
21+
- `wrangler pages build-env`
22+
23+
### Config redirect file
24+
25+
When running these commands, Wrangler will look up the directory tree from the current working directory for a file at the path `.wrangler/deploy/config.json`. This file must contain only a single JSON object of the form:
26+
27+
```json
28+
{ "configPath": "../../path/to/wrangler.json" }
29+
```
30+
31+
When this file exists Wrangler will follow the `configPath` (relative to the `.wrangler/deploy/config.json` file) to find an alternative Wrangler configuration file to load and use as part of this command.
32+
33+
When this happens Wrangler will display a warning to the user to indicate that the configuration has been redirected to a different file than the user's configuration file.
34+
35+
### Custom build tool example
36+
37+
A common approach that a build tool might choose to implement.
38+
39+
- The user writes code that uses Cloudflare Workers resources, configured via a user `wrangler.toml` file.
40+
41+
```toml
42+
name = "my-worker"
43+
main = "src/index.ts"
44+
[[kv_namespaces]]
45+
binding = "<BINDING_NAME1>"
46+
id = "<NAMESPACE_ID1>"
47+
```
48+
49+
Note that this configuration points `main` at user code entry-point.
50+
51+
- The user runs a custom build, which might read the `wrangler.toml` to find the entry-point:
52+
53+
```bash
54+
> my-tool build
55+
```
56+
57+
- This tool generates a `dist` directory that contains both compiled code and a new deployment configuration file, but also a `.wrangler/deploy/config.json` file that redirects Wrangler to this new deployment configuration file:
58+
59+
```plain
60+
- dist
61+
- index.js
62+
- wrangler.json
63+
- .wrangler
64+
- deploy
65+
- config.json
66+
```
67+
68+
The `dist/wrangler.json` will contain:
69+
70+
```json
71+
{
72+
"name": "my-worker",
73+
"main": "./index.js",
74+
"kv_namespaces": [{ "binding": "<BINDING_NAME1>", "id": "<NAMESPACE_ID1>" }]
75+
}
76+
```
77+
78+
And the `.wrangler/deploy/config.json` will contain:
79+
80+
```json
81+
{
82+
"configPath": "../../dist/wrangler.json"
83+
}
84+
```

‎.prettierignore

+4
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,7 @@ templates/*/dist
4040

4141
# This file intentionally has a syntax error
4242
fixtures/interactive-dev-tests/src/startup-error.ts
43+
44+
# These are generated by the build step
45+
fixtures/pages-redirected-config/build/*
46+
fixtures/redirected-config-worker/build/*

0 commit comments

Comments
 (0)
Please sign in to comment.