Skip to content

Custom PHP binary gets deleted if in root of project #115

@bmckay959

Description

@bmckay959

What were you trying to do?

I'm trying to get a custom PHP binary file to be used with the binaries being stored in the 'root' of my app(Inside the normal bin/os/arch structure.

What happened?

The php.exe gets deleted while using native:build but works fine under native:run due to / showing as no-op to empty().

How to reproduce the bug

Create a custom PHP binary file and put it in the root of the application with the following structure from the docs:

bin/{win}/{x64}/{php-8.4.zip}

Then, in your .env file, add NATIVEPHP_PHP_BINARY_PATH=./

When you run php artisan native:run, everything works as expected.

When you run php artisan native:build, the bin directory gets deleted at the vendor/nativephp/desktop/src/Builder/Concerns/PrunesVendorDirectory.php around lines 28-20

// Remove custom php binary package directory
        $binaryPackageDirectory = $this->binaryPackageDirectory();
        if (! empty($binaryPackageDirectory) && $filesystem->exists($this->buildPath("app/{$binaryPackageDirectory}"))) {
            $filesystem->remove($this->buildPath("app/{$binaryPackageDirectory}"));
        }

The value of binaryPackageDirectory() is interpolated naively into "app/{$binaryPackageDirectory}". When NATIVEPHP_PHP_BINARY_PATH is set to anything that normalizes to a no-op (./, ., /, or has trailing /.), Symfony\Component\Filesystem\Path::join('/build', 'app/./') collapses to /build/app, and the prune step deletes the entire built app right before electron-builder packages it.

Debug Output

This is my output AFTER I moved my bin a step inside of php-bin/bin to side step the bug.

{
"Environment": {
"PHP": {
"Version": "8.4.19",
"Path": "/Users/benjaminmckay/Library/Application Support/Herd/bin/php84"
},
"Laravel": {
"Version": "13.11.2",
"ConfigCached": false,
"RoutesCached": false,
"DebugEnabled": true
},
"Node": {
"Version": "v22.12.0",
"Path": "/Users/benjaminmckay/Library/Application Support/Herd/config/nvm/versions/node/v22.12.0/bin/node"
},
"NPM": {
"Version": "10.9.0",
"Path": "/Users/benjaminmckay/Library/Application Support/Herd/config/nvm/versions/node/v22.12.0/bin/npm"
},
"OperatingSystem": "Darwin",
"ElectronRoot": "nativephp/electron/"
},
"NativePHP": {
"Versions": {
"nativephp/desktop": "2.2.0.0",
"nativephp/php-bin": "1.1.1.0"
},
"Configuration": {
"Provider": "App\Providers\NativeAppServiceProvider",
"BuildHooks": {
"Pre": [
"npm run build"
],
"Post": []
},
"NotarizationEnabled": false,
"AzureTrustedSigningEnabled": false,
"CustomPHPBinary": "php-bin/"
}
}
}

Which operating systems have you seen this occur on?

macOS

Notes

If we add the following, I believe it solves the issue, but I'm still not super familiar with NativePHP enough to feel comfortable with any downstream effects.

$relative = trim($binaryPackageDirectory, "./\\ \t\n\r\0\x0B");
if ($relative !== '' && $filesystem->exists($this->buildPath("app/{$relative}"))) {
    $filesystem->remove($this->buildPath("app/{$relative}"));
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions