blob: 38126da20f68c5872486e2b7b3fe6ac8c471c058 [file] [log] [blame] [view]
# fx create
The `fx create` command generates scaffolding for new projects. See `fx create --help` for
usage details.
## Running tests
The tests should be included in the build along with the `//tools/create` target.
* Run all tests: `fx test //tools/create`
* Run only golden tests: `fx test //tools/create/goldens`
The golden projects have their unit tests run as well. To only run host tests,
pass the `--host` flag to `fx test`.
## Adding a new project type
1. Add a new directory with the project type name under `//tools/create/templates/`.
2. Populate the directory with the intended project structure
* Name all template files with the `.tmpl` extension or `.tmpl-<lang>` for
language-specific template files.
* Use `{{PROJECT_NAME}}` in a file/directory name to substitute the user's `PROJECT_NAME`.
3. Edit the `templates` target in `//tools/create/templates/BUILD.gn` to include all your new
template files.
4. Add the project type to the help doc-string in `CreateArgs` in `//tools/create/src/main.rs`.
5. Create a golden project in `//tools/create/goldens`.
* Use the `fx create` command to create a golden project, using the `--override-copyright-year 2020`
flag. This makes sure that tests don't start failing in 2021+.
6. Add a test target to `//tools/create/goldens/BUILD.gn`.
* See the existing tests for examples. Use the template in `//tools/create/goldens/golden_test.gni`.
* The test will generate a project and compare it with your golden project.
* Execute the test with `fx test //tools/create/goldens`.
## Templates
### Layout
Each top-level directory in `//tools/create/templates` corresponds to a project type
of the same name.
Files with the `.tmpl` and `.tmpl-*` extensions in these directories are [handlebars] templates.
Template expansion is performed on the templates and the directory structure is replicated in
the new project directory.
Templates with the `.tmpl` extension are language agnostic.
Templates with the `.tmpl-<lang>` extension are expanded only when the user supplies the
`--lang=<lang>` flag.
Multiple languages can be supported in the same template directory. For instance, the
`component-v2` command supports `cpp` and `rust` languages by having both a `BUILD.gn.tmpl-cpp`
and `BUILD.gn.tmpl-rust` file.
Partial templates are fragments of template files that can be included by other templates.
Partial templates begin with `_` and can be included in a template with the `{{>name_of_partial}}`
without the leading `_`.
Only partial templates at the root or within the project type directory being executed are
available to a template.
E.g. file layout:
* `templates/`
- `_copyright.tmpl`
- `component-v2/`
* `_common.tmpl`
When creating a project of type `component-v2`, the partial templates `_copyright.tmpl` and
`component-v2/_header.tmpl` are visible and can be executed with `{{>copyright}}` and
`{{>component-v2/header}}`.
### Variables
The template expansion uses [handlebars] syntax. Expand a variable with the syntax `{{VAR_NAME}}`.
The available variable names are:
* `COPYRIGHT_YEAR`: Today's year, eg. 2020, for use in copyright headers,
* `PROJECT_NAME`: The user-specified project name,
* `PROJECT_PATH`: The path from the fuchsia root directory to the new project,
* `PROJECT_TYPE`: The project-type as specified on the command line, e.g: 'component-v2'.
* `TEMPLATE_PATH`: The path to the source template being executed.
Path names are also treated as template strings and can contain [handlebars] syntax.
Eg. `component/meta/{{PROJECT_NAME}}.cml.tmpl` with `PROJECT_NAME="foo"` expands to `meta/foo.cml`.
#### Adding a new variable
To make a new variable accessible to templates, add it to `TemplateArgs` in
`//tools/create/src/main.rs`.
### Helpers
Helper functions can be invoked with the syntax `{{helper VAR_NAME}}`.
The available helper functions are:
* `pascal_case`: Converts a string argument into *P*ascal*C*ase,
* `snake_case`: Converts a string argument into snake*_*case,
* `screaming_snake_case`: Converts a string argument into SCREAMING_SNAKE_CASE,
#### Adding a new helper
To make a new helper function accessible to templates, follow instructions in
`//tools/create/src/template_helpers.rs`.
[handlebars]: https://docs.rs/handlebars