search hotlink icon profile hotlink icon
Package avatar Public | 1.1.x - 1.x.x

On This Page

Since Fusion itself is an extendable package, you can create your own package manager on top by using it as a dependency and extending it through its built-in extension logic. For backward compatibility and recursive self-management, the metadata still defines the deprecated extension directory indicators, which are now represented by the adjective extendable:

                {
    "structure": {
        "/extensions": {
            "/config": "extension",
            "/src": "extension"
        }
    }
}
            

Note

With version 1.1.0 extension injection into other packages is deprecated. Instead, extender directories are mapped abstractly through the metadata structure.

With this new, simpler abstract approach, the metadata structure is equivalent to:

                {
    "structure": {
        "/extensions/config": "extendable"
    }
}
            

As we can see, only the config directory remains relevant in this example.

Note

For simplicity, this example omits common version control steps and assumes you know how to manage a project with your version control system. We focus solely on creating an easy-to-follow development build of a custom package manager on top of Fusion, which you would later commit to your repository.

Production Metadata

Like any project, we start by creating the fusion.json file in an empty directory of your choice with the following dummy content:

                {
    "name": "Package",
    "description": "Custom package manager.",
    "id": "valvoid/package",
    "version": "0.1.0",
    "structure": {
        "/config": ":valvoid/fusion/extensions/config",
        "/dependencies": "valvoid.com/valvoid/fusion/1.1.0",
        "/state": "stateful"
    },
    "environment": {
        "php": {
            "version": "8.1.0"
        }
    }
}
            

Beyond the required basic entries, our metadata declares Fusion as a nested dependency and, as derived from the deprecated metadata above, maps the extendable configuration path to our local config path. For this example page, we leave the path as abstract in the metadata and run the build command from the project directory:

                fusion build
            

Note

We did not create the config directory here for simplicity, since we do not run any configured commands from the nested Fusion. Otherwise, the directory would need to exist.

Once done, the project directory now includes the downloaded Fusion package with the generated extensions.php file in the state directory (other files not shown here for simplicity):

  • dependencies
    • valvoid/fusion: Nested Fusion package
      • state/extensions.php: Built-in extension
  • fusion.json

This file is where the built-in extension logic records the mapped directories as a persistence layer. In our example, it contains the following simplified content:

                return [
    "/extensions/config" => [
        1 => "<our project absolute dir>/config",
    ]
];
            

Now, when loading the configuration, Fusion reads our mapped config directory on top of its own default files, allowing us to extend or completely override them.

User-Wide Terminal Interaction

Fusion isolates the user scoped config, state, and cache paths using the root package identifier, which you can list with the -p option:

                fusion -p
            

For the system-wide standalone version we currently use, these paths end with the case-insensitive valvoid/fusion segments. Running the nested version in our example from its root directory shows paths ending with valvoid/package segments:

                php ./dependencies/valvoid/fusion/fusion -p
            

Due to this separation, we can run our in-development package manager alongside the system-wide Fusion installation without conflicts. Since the system already has the default fusion executable, we link our user-wide version as custom-fusion:

  • dependencies
    • valvoid/fusion: Nested Fusion package
      • fusion: CLI file we link

Linux Commands

Ensure the user-wide binary directory exists:

                mkdir -p $HOME/.local/bin
            

If the directory was just created, reload your profile in the current session (or log out and back in) to add it to the PATH:

                source $HOME/.profile
            

From the project root, link Fusion's CLI file to the user-wide binary directory:

                ln -s $PWD/dependencies/valvoid/fusion/fusion $HOME/.local/bin/custom-fusion
            

Make the link executable:

                chmod +x $HOME/.local/bin/custom-fusion
            

Verify the installation:

                custom-fusion -v
            

macOS Commands

Ensure the user-wide binary directory exists:

                mkdir -p $HOME/.local/bin
            

Add it to the PATH variable if not already present:

                echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile
            

If the directory was just created, reload your profile in the current session (or log out and back in) to add it to the PATH:

                source $HOME/.zprofile
            

From the project root, link Fusion's CLI file to the user-wide binary directory:

                ln -s $PWD/dependencies/valvoid/fusion/fusion $HOME/.local/bin/custom-fusion
            

Make the link executable:

                chmod +x $HOME/.local/bin/custom-fusion
            

Verify the installation:

                custom-fusion -v
            

Windows Commands

Ensure the user-wide binary directory exists:

                New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\bin"
            

From the project root, create a launcher batch file pointing to the CLI file:

                Set-Content "$env:USERPROFILE\bin\custom-fusion.bat" `
    -Value '@php "%CD%\dependencies\valvoid\fusion\fusion" %*'
            

Add the binary directory to your PATH variable (takes effect in new sessions) and restart PowerShell or open a new session to load it:

                setx PATH "$env:USERPROFILE\bin;$env:PATH"
            

Verify the installation:

                custom-fusion -v