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}"));
}
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:buildbut works fine undernative:rundue 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
.envfile, addNATIVEPHP_PHP_BINARY_PATH=./When you run
php artisan native:run, everything works as expected.When you run
php artisan native:build, thebindirectory gets deleted at thevendor/nativephp/desktop/src/Builder/Concerns/PrunesVendorDirectory.phparound lines 28-20The 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
bina step inside ofphp-bin/binto 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.