I thought I’d chime in with a suggestion as well.
Option 1
Another approach would be to have a site config (a PipelineConfiguration
entity with no project set), using a distributed setup. This will mean that all projects that don’t have their own config will use the site config (you will still need to set a tank_name
value on each Project
entity).Then to take over for a specific project, you can just create a PipelineConfiguration
for that project. That will be a full config take over though.
Option 2
If you just want to handle taking over specific hooks or environment yaml files, then you could maybe make use of environment variables. Here is an example:
Here is a config where I just mocked up a test: garden_show.zip (286.4 KB)
In this config, if you were in a project called garden show
then it would not show the software launchers in Shotgun Desktop, but for all other projects it would.
In the config, I used environment variables to define the includes path.
I also added code to the pick_environment.py
core hook, that contained the following code to set the environment variable based upon the project the configuration was linked to. If a project-specific settings folder was found (named after the project) , then it would define the PROJECT_SETTINGS
env var to that. If one isn’t found it would define the env var to settings
(which is the default folder.)
if context.project is None:
os.environ["PROJECT_SETTINGS"] = "settings"
return
# set an environment variable that will later be used to resolve the include path to the project
# specific settings inside the generic config.
settings_folder_name = "{0}_settings".format(context.project["name"])
# remove any spaces from the name
settings_folder_name = settings_folder_name.replace(" ", "_").lower()
# Check project settings exist
config_path = self.sgtk.configuration_descriptor.get_path()
settings_folder_path = os.path.join(config_path, "env", "includes", settings_folder_name)
self.logger.debug("checking for project specific settings here: %s" % settings_folder_path)
if not os.path.exists(settings_folder_path):
# no project specific settings found use the default location
settings_folder_name = "settings"
self.logger.debug("Using settings folder name: %s" % settings_folder_name)
os.environ["PROJECT_SETTINGS"] = settings_folder_name
I also took over the bootstrap.py
core hook and added os.environ["PROJECT_SETTINGS"] = 'settings'
so that if the config is used as a site config then it will take the settings
block.
This is just an example though, there are probably a number of different ways to set up something similar.