additional_packaging.py file¶
To extend the build process, create a additional_packaging.py file in the root directory of your source code — that is, the same level where your package directory is located.
This file should have either of the below two functions:
- the 
cleanup_output_filesfunction, which acceptsoutput_path(str),add-on name(str) as its arguments. - the 
additional_packagingfunction, which acceptsadd-on name(str) as its only argument. 
First the cleanup_output_files function would be called from ucc-gen build process and then additional_packaging function.
See the following example for proper usage:
- Build custom UI after 
ucc-genfinishes all its necessary steps. - Use a workaround for a 
ucc-genfeature that has not been implemented. 
Example¶
Below is an example of additional_packaging.py containing both the implementations of functions.
from os.path import sep, exists, dirname, realpath, join
from os import remove, system, _exit, WEXITSTATUS
def additional_packaging(ta_name=None):
    """
    `build-ui.sh` builds custom component present in source code and ships them in the output directory
    """
    if exists(
        join(dirname(realpath(__file__)), "build-ui.sh")
    ):
        system("chmod +x ./build-ui.sh")
        return_code = system("./build-ui.sh")
        if return_code != 0:
            _exit(WEXITSTATUS(return_code))
def cleanup_output_files(output_path: str, ta_name: str) -> None:
    """
    prepare a list for the files to be deleted after the source code has been copied to output directory
    :param output_path: The path provided in `--output` argument in ucc-gen command or the default output path.
    :param ta_name: The add-on name which is passed as a part of `--addon-name` argument during `ucc-gen init` 
                    or present in app.manifest file of add-on.
    """
    files_to_delete = []
    files_to_delete.append(sep.join([output_path, ta_name, "default", "redundant.conf"]))
    files_to_delete.append(sep.join([output_path, ta_name, "bin", "template_modinput_layout.py"]))
    files_to_delete.append(sep.join([output_path, ta_name, "bin", "example_one_input_one.py"]))
    files_to_delete.append(sep.join([output_path, ta_name, "bin", "template_rest_handler_script.py"]))
    files_to_delete.append(sep.join([output_path, ta_name, "bin", "file_does_not_exist.py"]))
    files_to_delete.append(sep.join([output_path, ta_name, "default", "nav", "views", "file_copied_from_source_code.xml"]))
    for delete_file in files_to_delete:
        try:
            remove(delete_file)
        except (FileNotFoundError):
            # simply pass if the file doesn't exist
            pass