Directory structure
Tanka uses the following directories and special files:
- Directory. the project (<rootDir>)- Directoryenvironments- Directorydefault default environment- main.jsonnet main file
- spec.json environment’s config
 
 
- jsonnetfile.json direct dependencies
- jsonnetfile.lock.json all dependencies with exact versions
- Directorylib libraries for this project only- k.libsonnet alias file for vendor/github.com/jsonnet-libs/k8s-libsonnet/1.21/main.libsonnet
 
- Directoryvendor external libraries installed using jb- Directorygithub.com- Directorygrafana- Directoryjsonnet-libs- Directoryksonnet-util Grafana Labs’ usability extensions to k.libsonnet- kausal.libsonnet
- …
 
 
 
- Directoryjsonnet-libs- Directoryk8s-libsonnet- Directory1.21 kubernetes library- main.libsonnet
- …
 
 
 
 
- Directory1.21/ -> github.com/jsonnet-libs/k8s-libsonnet/1.21- …
 
- Directoryksonnet-util/ -> github.com/grafana/jsonnet-libs/ksonnet-util- …
 
 
 
Environments
Section titled “Environments”Tanka organizes configuration in environments. For the rationale behind this, see the section in the tutorial.
An environment consists of at least two files:
spec.json
Section titled “spec.json”This file configures environment properties such as cluster connection
(spec.apiServer), default namespace (spec.namespace), etc.
For the full set of options, see the Golang source code.
main.jsonnet
Section titled “main.jsonnet”Like other programming languages, Jsonnet needs an entrypoint into the
evaluation, something to begin with. main.jsonnet is exactly this: The very
first file being evaluated, importing or directly specifying everything required
for this specific environment.
Root and Base
Section titled “Root and Base”When talking about directories, Tanka uses the following terms:
| Term | Description | Identifier file | 
|---|---|---|
| rootDir | The root of your project | jsonnetfile.jsonortkrc.yaml | 
| baseDir | The directory of the current environment | main.jsonnet | 
Regardless what subdirectory of the project you are in, Tanka will always be
able to identify both directories, by searching for the identifier files in the
parent directories.
Tanka needs these for correctly setting up the import paths.
This is similar to how git always works, by looking for the .git directory.
Libraries
Section titled “Libraries”Tanka relies heavily on code-reuse, so libraries are a natural thing. Roughly spoken, they can be imported from two paths:
- /lib: Project local libraries
- /vendorExternal libraries
For more details consider the import paths.
jsonnetfile.json and the lock
Section titled “jsonnetfile.json and the lock”jb records all external packages installed in a file called
jsonnetfile.json. This file is the source of truth about what should be
included in vendor/. However, it should only include what is really directly
required, all recursive dependencies will be handled just fine.
jsonnetfile.lock.json is generated on every run of jsonnet-bundler, including
a list of packages that must be included in vendor/, along with the exact
version and a sha256 hash of the package contents.
Both files should be checked into source control: The jsonnetfile.json
specifies what you need and the jsonnetfile.lock.json is important to make
sure that subsequent jb install invocations always do the exact same thing.