I was reminded today that in order to get symlinks to create on a windows machine that you need to “run as administrator” when starting your console, otherwise you’ll get an error like “Warning: symlink(): Cannot create symlink, error code(1314)” . While we’re on the topic, how about I demo how the autoloader is setup in my composer.json file along with the calling of post install and post update scripts.
"autoload": { "psr-4": { "Nick\\": "script/" } }, "require": { "php": ">=5.4", "wordpress/wordpress": "4.0" }, "scripts": { "post-install-cmd": [ "Nick\\Install::symlinks" ], "post-update-cmd": [ "Nick\\Install::symlinks" ] }, |
Then, my post install file lives at /script/Install.php
<?php namespace Nick; use Composer\Script\Event; class Install { public static function symlinks(Event $event) { $rootDir = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR; $wordpressDir = $rootDir . 'vendor' . DIRECTORY_SEPARATOR . 'wordpress' . DIRECTORY_SEPARATOR . 'wordpress' . DIRECTORY_SEPARATOR; //htaccess file if(! file_exists($wordpressDir . '.htaccess')) { symlink($rootDir . '.htaccess', $wordpressDir . '.htaccess'); } //wordpress config file if(! file_exists($wordpressDir . 'wp-config.php')) { symlink($rootDir . 'config' . DIRECTORY_SEPARATOR . 'wp-config.php', $wordpressDir . 'wp-config.php'); } //wordpress db config file if(! file_exists($wordpressDir . 'db-config.php')) { symlink($rootDir . 'config' . DIRECTORY_SEPARATOR . 'db-config.php', $wordpressDir . 'db-config.php'); } //wordpress if(! file_exists($rootDir . 'public' . DIRECTORY_SEPARATOR . 'wp')) { symlink($wordpressDir, $rootDir . 'public' . DIRECTORY_SEPARATOR . 'wp'); } } } |
Note that I’ve chosen to separate the database connection from the main wordpress config file so it can be ignored separately in version control.
Elevated privs are no longer required for symlinks in Win10, “Developer mode” is supposed to solve the problem. But… Not sure how this works with composer. https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/