@title Arcanist User Guide: Configuring a New Project @group userguide Explains how to configure Arcanist projects with ##.arcconfig## files. = .arcconfig Basics = Arcanist uses ##.arcconfig## files to determine a number of things about project configuration. For instance, these are things it figures out from ##.arcconfig##: - where the logical root directory of a project is; - which server Arcanist should send diffs to for code review; and - which lint rules should be applied. An ##.arcconfig## file is a JSON file which you check into your project's root. A simple, valid file looks something like this: { "project_id" : "some_project_name", "conduit_uri" : "https://phabricator.example.com/" } Here's what these options mean: - **project_id**: a human-readable string identifying the project - **conduit_uri**: the URI for the Phabricator installation that Arcanist should send diffs to for review. Be mindful about "http" vs "https". For an exhaustive list of available options, see below. = Advanced .arcconfig = Other options include: - **lint_engine**: the name of a subclass of @{class@arcanist:ArcanistLintEngine}, which should be used to apply lint rules to this project. See @{article:Arcanist User Guide: Customizing Lint, Unit Tests and Workflows}. - **unit_engine**: the name of a subclass of @{class@arcanist:ArcanistBaseUnitTestEngine}, which should be used to apply unit test rules to this project. See @{article:Arcanist User Guide: Customizing Lint, Unit Tests and Workflows}. - **arcanist_configuration**: the name of a subclass of @{class@arcanist:ArcanistConfiguration} which can add new command flags for this project or provide entirely new commands. - **remote_hooks_installed**: tells Arcanist that you've set up remote hooks in the master repository (see @{article:Arcanist User Guide: Repository Hooks}). - **copyright_holder**: used by @{class@arcanist:ArcanistLicenseLinter} to apply license notices to source files. - **phutil_libraries**: map of additional Phutil libraries to load at startup. See below for details about path resolution, or see @{article:libphutil Libraries User Guide} for a general introduction to libphutil libraries. = How Libraries Are Located = If you specify an external library to load, like 'examplelib', and use a relative path like this: { ... "load_libraries": { "examplelib" : "examplelib/src" }, ... } ...arc looks for it by trying these paths: - `path/to/root/examplelib/src/` First, arc looks in the project's root directory (where the .arcconfig lives) to see if the library is part of the project. This makes it easy to just put project-specific code in a project. - `path/to/root/../examplelib/src/` Next, arc looks //next to// the project's root directory to see if the library is in a sibling directory. If you work with several repositories, this makes it easy to put all the `arc` code in one repository and just check it out in the same directory as everything else. - `php/include/path/examplelib/src` Finally, arc falls back to PHP, which will look in paths described in the `include_path` php.ini setting. This allows you to install libraries in some global location if you prefer. You can alternately supply an absolute path, like `/var/arc/examplelib/src`, but then everyone will need to install the library at that exact location. NOTE: Specify the path to the directory which includes `__phutil_library_init__.php`. For example, if your init file is in `examplelib/src/__phutil_library_init__.php`, specify `examplelib/src`, not just `examplelib/`. The general intent here is: - Put project-specific code in some directory in the project, like `support/arc/src/`. - Put shared code (e.g., which enforces general coding standards or hooks up to unit tests or whatever) in a separate repository and check it out next to other repositories. - Or put everything in some standard location and add it to `include_path`.