GCNCNS - WP Plugin Boiler Plate
WP Plugin Boilerplate for building plugins with composer and keeping third-party dependencies in repository, (*1)
Yet another plugin boilerplate?
Yes! This one aims at preventing conflicts caused by third-party libraries by renaming their namespaces.
Compared to other boilerplates out there this one does not provide you with WordPress-specific tools or reusable code., (*2)
GCNCNS??
Grunt Composer No Conflict Namespaces, (*3)
How to use
Getting things ready
-
Create a new plugin by running composer create-project alpipego/gcnsnc ./PLUGIN_NAME., (*4)
-
You can then update the composer.json file with your plugin details (or remove it altogether)., (*5)
-
Install node packages by running npm install (or yarn or whatever you want to use)., (*6)
Settings
Update Gruntfile.js with your plugins namespace, i.e. replace MyNamespace\\MySubNamespace with your namespace (and subnamespace). By default all third-party code will be copied to src/Common and the namespace will be prefixed with the values in the namespaces object., (*7)
namespace GuzzleHttp;
will be replaced with, (*8)
namespace MyNamespace\MySubNamespace\Common\GuzzleHttp;
Adding Packages
Besides adding your required packages to composer, you will also need to add them to the task in grunt/copy.js. (Note the usage of the namespaces.thirdParty variable)., (*9)
The simplest form is a JavaScript object with src and dest properties:, (*10)
{
src: 'vendor/composer/ClassLoader.php',
dest: 'src/<% namespaces.thirdParty %>/Composer/Autoload/ClassLoader.php'
}
This will copy a single .php file to the src directory. Copying all contents from a directory is as simple:, (*11)
{
expand: true,
cwd: 'vendor/psr/container/src',
src: '**',
dest: 'src/<% namespaces.thirdParty %>/Psr/Container'
}
If you want to copy some files but not others this can be achieved as well:, (*12)
{
expand: true,
cwd: 'vendor/pimple/pimple/src/Pimple',
src: ['**', '!**/Tests/**'],
dest: 'src/<% namespaces.thirdParty %>/Pimple'
}
Read more about grunt globbing here., (*13)
Autoloading packages
Instead of including composers autoload.php use the ClassLoader class it provides. Add this at the top of your plugin (or in a bootstrap file):, (*14)
use MyNamespace\MySubNamespace\Common\Composer\Autoload\ClassLoader;
require_once __DIR__ . '/src/Common/Composer/Autoload/ClassLoader.php';
$loader = new ClassLoader();
$loader->setPsr4('MyNamespace\\MySubNamespace\\', realpath(__DIR__ . '/src/'));
$loader->register();
You will have to change the namespace and directories to fit your setup, find the documentation for the ClassLoader here., (*15)
Run it
Running it is as simple as grunt thirdParty after packages have been installed. This could also go into a composer script, e.g., post-update-cmd., (*16)