When you run eas build, we need to get your source code from your development machine to one of our macOS or Linux build workers. In order to do this, EAS CLI will collect and compress project files into a single archive, and then upload that archive to private cloud storage that is accessible only to the build worker. By default, EAS CLI will produce the archive by copying all files starting from the root of the git repository with the exception of .git, node_modules, and all files matched by rules from .gitignore (or .easignore if it exists).
.easignoresupports the same path patterns as.gitignorefiles, but it can only be located in the root of your git repository and, if it is present, none of the existing.gitignorefiles will be respected by EAS CLI.
You likely do not want to upload your node_modules directory, or maybe you have a .env file that is ignored by source control. EAS CLI always respects .gitignore files, but depending on your configuration there might be certain edge cases where EAS behavior is not 100% compliant with git.
You can run eas build:inspect --platform [ios|android] --stage archive --output ~/target/output/path --profile production and inspect the output directory (in this case ~/target/output/path) to see which files are included.
By default, or if you set the EAS_NO_VCS environment variable, EAS CLI will use its own packaging algorithm that approximates git clone --depth 1 ... and allows you to build with a dirty git working tree. The following limitations apply when using this approach:
- If you have multiple
.gitignorefiles, they are applied in isolation starting from the root, so if you have an ignore rule liketest/examplein the parent directory and!example/example1in thetestdirectory then the entireexampledirectory will still be ignored. - The
node_modulesdirectory is ignored by default. - Even if you are using
git-crypt, all the files are uploaded as they are in your project directory. This means all sensitive files could be uploaded to EAS Build in a non-encrypted state. - The
.gitdirectory is not uploaded to EAS Build. So if you are using any tools that depend on the state of the Git repository, this might result in unexpected behavior (e.g. sentry reads the commit hash when uploading the source maps). - The content of the submodules will be included as they are in your working directory.
If you set { "cli": { "requireCommit": true } } at the root level of your eas.json, EAS CLI will use the git clone --depth 1 ... command to create a shallow clone of your repository. With this approach, the project uploaded to EAS Build will be exactly the same as in Git - including information like the branch, commit hash, and so on.
Note:
.easignoreis not supported if you setrequireCommit: truein youreas.json
You can test this on your development machine against your local project directory by running the following command:
# Replace paths below with paths that make sense for your machine / operating system
git clone --local --no-hardlinks --depth 1 file:///path/to/your/git/repo- ~/path/to/clone/to
Alternatively, a fresh git clone from your remote would also be sufficient.
Environment variables are easy enough to handle, you can set those values using Secrets; but, in some cases, your build may depend on files that you consider sensitive and do not want to commit to source control.
In these cases, you can encode the contents of the file with base64, save that string as secrets, and then create the file in an EAS Build hook. See "How to use Git submodules" for an example. Alternatively, you can opt out of using Git and use .easignore instead.
The default workflow does not require that you commit your changes, but git itself is still used to read some metadata about the repository. You can set the EAS_NO_VCS=1 environment variable to skip using Git for all EAS CLI commands and optionally EAS_PROJECT_ROOT to define the root of your project if it is different than location of your eas.json file.
If you want to use .easignore instead of .gitignore with EAS_NO_VCS=1, then you need to place it in the directory pointed to by the EAS_PROJECT_ROOT environment variable (if it's set), or in the same directory as your eas.json otherwise.