Giter Site home page Giter Site logo

typisttech / imposter-plugin Goto Github PK

View Code? Open in Web Editor NEW
140.0 10.0 12.0 933 KB

Composer plugin that wraps all composer vendor packages inside your own namespace. Intended for WordPress plugins.

Home Page: https://www.typist.tech/projects/imposter-plugin

License: MIT License

PHP 100.00%
composer-plugin namespace monkey-patching dependency php devtools wordpress-development wordpress

imposter-plugin's Introduction

Imposter Plugin

Packagist Packagist PHP from Packagist CircleCI license Twitter Follow @TangRufus Hire Typist Tech

Composer plugin that wraps all composer vendor packages inside your own namespace. Intended for WordPress plugins.

Built with ♥ by Typist Tech


Imposter Plugin is an open source project and completely free to use.

However, the amount of effort needed to maintain and develop new features is not sustainable without proper financial backing. If you have the capability, please consider donating using the links below:

GitHub via Sponsor Sponsor via PayPal More Sponsorship Information


Wrapping all composer vendor packages inside your own namespace. Intended for WordPress plugins. Imposter Plugin is a composer plugin wrapper for Imposter.

Why?

Because of the lack of dependency management in WordPress, if two plugins bundled conflicting versions of the same package, hard-to-reproduce bugs arise. Monkey patching composer vendor packages, wrapping them inside your own namespace is a less-than-ideal solution to avoid such conflicts.

See:

Install

Installation should be done via composer, details of how to install composer can be found at https://getcomposer.org/.

First, add Imposter configuration in your composer.json

"extra": {
    "imposter": {
        "namespace": "My\\App\\Vendor",
        "excludes": [
            "dummy/dummy-excluded"
        ]
    }
}

Then, install via composer cli

composer require typisttech/imposter-plugin

See: Imposter readme for details.


Typist Tech is ready to build your next awesome WordPress site. Hire us!


Usage

Sit Back and Relax

Once installed, this plugin hooks into composer install, composer update and composer dump-autoload, automatically run imposter for you. Besides, imposter plugin autoloads all modified files as classmap.

When those events triggered, this plugin:

  1. looks for /path/to/project/root/composer.json
  2. finds out vendor-dir
  3. finds out all required packages, including those required by dependencies
  4. finds out all autoload paths for all required packages
  5. prefixes all namespaces with the imposter-plugin namespace defined in your composer.json

Learn more on imposter's readme.

Known Issues

Help wanted. Pull requests are welcomed.

  1. Imposter run twice when composer install and composer update
  2. Traits are not transformed
  3. Virtual packages are not supported

Frequently Asked Questions

What can I find more information?

Learn more on imposter's readme for more details.

How about not hooking into composer commands?

Use imposter directly.

How to distrube impostified plugins?

  1. Switch to the lowest PHP version you support
  2. Install dependencies
    • $ composer install --no-dev --classmap-authoritative --prefer-dist
  3. Clean up the source code, e.g: remove test files
  4. Zip the source code. Tips: Use $ composer archive
  5. Send the zip to others / Commit to wp.org SVN. Tips:

How to install impostified plugins via composer?

Impostified plugins are meant to be commited to wp.org svn.

Using imposter means you forgo the ability to install the plugins with composer directly via packagist.org or VCS (even with type: wordpress-plugin in composer.json).

To composer require impostified plugins, use wpackagist.org.

The whole imposter situation is horrible. What can we do about it?

Until WordPress core comes up with a solution on dependency managment, keep clam and carry on.

In the meantime, checkout these tools to make WordPress suck less modernizing WordPress development:

Do you have real life examples that use this composer plugin?

Here you go:

Add your own here

Which composer versions are supported?

Both v1 and v2.

Will you add support for older PHP versions?

Never! This plugin will only work on actively supported PHP versions.

Don't use it on end of life or security fixes only PHP versions.

It looks awesome. Where can I find some more goodies like this

Where can I give 5-star reviews?

Thanks! Glad you like it. It's important to let me knows somebody is using this project. Please consider:

Testing

composer test
composer style:check

Alternatives

Here is a list of alternatives that I found. However, none of these satisfied my requirements.

If you know other similar projects, feel free to edit this section!

  • Mozart by Coen Jacobs

    • Works with PSR0 and PSR4
    • Dependency packages store in a different directory
  • PHP Scoper

    • Prefixes all PHP namespaces in a file/directory to isolate the code bundled in PHARs

Feedback

Please provide feedback! We want to make this project as useful as possible. Please submit an issue and point out what you do and don't like, or fork the project and send pull requests. No issue is too small.

Security Vulnerabilities

If you discover a security vulnerability within this project, please email us at [email protected]. All security vulnerabilities will be promptly addressed.

Credits

Imposter Plugin is a Typist Tech project and maintained by Tang Rufus, freelance developer for hire.

Full list of contributors can be found here.

License

Imposter Plugin is released under the MIT License.

imposter-plugin's People

Contributors

dependabot-preview[bot] avatar tangrufus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

imposter-plugin's Issues

Fatal error: Cannot declare class

Good evening.

I have tried imposter-plugin for composer but i think i'm not using it in the right way: i placed this code in composer.json file:

"extra": {
    "imposter": {
      "namespace": "My\\Vendor",
      "excludes": [ ]
    }
  }

And then i installed the imposter plugin via composer require.
Then i run composer install and all my classes get namespaced but when i try to use them im getting the errors:

Fatal error: Cannot declare class Ekr\Vendor\Monolog\Formatter\LineFormatter, because the name is already in use in /var/www/html/.../vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php on line 0

Wich is my mistake?

Issues with Guzzle (PSR4 transforming)

Detailed description

I'm maintining a wide variaty of WHMCS modules. Recently WHMCS seems to started using Composer in their own, closed source, software - which conflicts with my modules. Since them I'm looking for such a plugin as Imposter to fix my dependency issues.

Most things seems to work just fine, expect with Guzzle and loading PSR-4 classes.

For example a trace I gathered. Here the core WHMCS software requests Guzzle, and the autoloader seems to respond with my transformed Guzzle instance:

1  Composer\Autoload\includeFile(/var/www/*/app/modules/addons/mollierecurring/vendor/composer/../guzzlehttp/guzzle/src/ClientInterface.php) called at [/var/www/*/app/vendor/composer/ClassLoader.php:322]
--
  | #2  Composer\Autoload\ClassLoader->loadClass(DevApp\WHMCS\MollieRecurring\Vendor\GuzzleHttp\ClientInterface)
  | #3  spl_autoload_call(DevApp\WHMCS\MollieRecurring\Vendor\GuzzleHttp\ClientInterface) called at [/var/www/*/app/modules/addons/mollierecurring/vendor/guzzlehttp/guzzle/src/Client.php:25]
  | #4  include(/var/www/*/app/modules/addons/mollierecurring/vendor/guzzlehttp/guzzle/src/Client.php) called at [/var/www/*/app/vendor/composer/ClassLoader.php:444]
  | #5  Composer\Autoload\includeFile(/var/www/*/app/modules/addons/mollierecurring/vendor/composer/../guzzlehttp/guzzle/src/Client.php) called at [/var/www/*/app/vendor/composer/ClassLoader.php:322]
  | #6  Composer\Autoload\ClassLoader->loadClass(GuzzleHttp\Client)
  | #7  spl_autoload_call(GuzzleHttp\Client) called at [/var/www/*/app/vendor/whmcs/whmcs-foundation/lib/Admin/Setup/General/UriManagement/ConfigurationController.php:0]
  | #8  WHMCS\Admin\Setup\General\UriManagement\ConfigurationController->queryEnvironmentMode() called at [/var/www/*/app/vendor/whmcs/whmcs-foundation/lib/Admin/Setup/General/UriManagement/ConfigurationController.php:0]
  | #9  WHMCS\Admin\Setup\General\UriManagement\ConfigurationController->remoteDetectEnvironmentMode(WHMCS\Http\Message\ServerRequest Object ([*queryBag] => Symfony\Component\HttpFoundation\ParameterBag Object ([*parameters] => Array ()),[*requestBag] => Symfony\Component\HttpFoundation\ParameterBag Object ([*parameters] => Array ()),[*attributesBag] => Symfony\Component\HttpFoundation\ParameterBag Object ([*parameters] => Array ()),[Zend\Diactoros\ServerRequestattributes] => Array (),[Zend\Diactoros\ServerRequestcookieParams] => Array (),[Zend\Diactoros\ServerRequestparsedBody] => ,[Zend\Diactoros\ServerRequestqueryParams] => Array (),[Zend\Diactoros\ServerRequestserverParams] => Array (),[Zend\Diactoros\ServerRequestuploadedFiles] => Array (),[*headers] => Array (),[*headerNames] => Array (),[Zend\Diactoros\ServerRequestprotocol] => 1.1,[Zend\Diactoros\ServerRequeststream] => Zend\Diactoros\PhpInputStream Object ([Zend\Diactoros\PhpInputStreamcache] => ,[Zend\Diactoros\PhpInputStreamreachedEof] => ,[*resource] => Resource id #361,[*stream] => php://input),[Zend\Diactoros\ServerRequestmethod] => ,[Zend\Diactoros\ServerRequestrequestTarget] => ,[Zend\Diactoros\ServerRequesturi] => Zend\Diactoros\Uri Object ([*allowedSchemes] => Array ([http] => 80,[https] => 443),[Zend\Diactoros\Urischeme] => ,[Zend\Diactoros\UriuserInfo] => ,[Zend\Diactoros\Urihost] => ,[Zend\Diactoros\Uriport] => ,[Zend\Diactoros\Uripath] => ,[Zend\Diactoros\Uriquery] => ,[Zend\Diactoros\Urifragment] => ,[Zend\Diactoros\UriuriString] => ))) called at [/var/www/*/app/vendor/whmcs/whmcs-foundation/lib/Admin/Setup/General/UriManagement/View/Helper/SimpleSetting.php:0]
  | #10 WHMCS\Admin\Setup\General\UriManagement\View\Helper\SimpleSetting->getSimpleSettingHtmlPartial() called at [/var/www/*/app/admin/configgeneral.php:0]

This results in either incompatbility or Cannot declare class DevApp\WHMCS\MollieRecurring\Vendor\GuzzleHttp\Client, because the name is already in use in /var/www/*/app/modules/addons/mollierecurring/vendor/guzzlehttp/guzzle/src/Client.php on line 25-errors.

Also - the autoloading files for Guzzle does not work. This because Guzzle includes this file, which checks if GuzzleHttp\uri_template is loaded - but most of the time it is (because of the core software, which already has Guzzle loaded) and so my namespace's Guzzle functions won't get loaded.

WHMCS loads Composer itself and I'm not sure how their composer.json looks like. Mine is, for example:

{
    "require": {
        "mollie/mollie-api-php": "2.0.*",
        "typisttech/imposter-plugin": "^0.3.0"
    },
    "config": {
        "vendor-dir": "src/addons/mollierecurring/vendor"
    },
    "extra": {
        "imposter": {
            "namespace": "DevApp\\WHMCS\\MollieRecurring\\Vendor\\"
        }
    }
}

Context

It is important to me to keep using my current packages (I don't use guzzle directly, but most of my packages do). This could also benefit other people, as Guzzle is a widely used package to handle HTTP requests.

Possible implementation

Unsure. Maybe manually update the PSR-4 mapping?

Your environment

  • PHP 7.2
  • WHMCS addons
  • Different Guzzle versions

[ErrorException] array_merge() expects at least 1 parameter, 0 given

I'm getting the following error after running composer imposter:run

[ErrorException]
array_merge() expects at least 1 parameter, 0 given

My composer.json file:

{
 // ...
  "require": {
    "composer/installers": "~1.0",
    "timber/timber": "^1.5",
    "abraham/twitteroauth": "^0.7.4",
    "defuse/php-encryption": "^2.1",
    "guzzlehttp/guzzle": "^6.3",
    "brain/cortex": "~1.0.0@dev",
    "symfony/var-dumper": "^4.2.0",
    "monolog/monolog": "^1.24.0",
    "google/cloud-firestore": "^1.0.0",
    "typisttech/imposter-plugin": "^0.3.1"
  },
  "autoload": {
    "psr-4": {
      "Sw\\": "lib/Sw/"
    },
    "files": [
        // some files here
    ]
  },
  "extra": {
    "imposter": {
      "namespace": "Sw\\Vendor"
    }
  }
}

Namespace change not applied to functions

What would need to be done to address this? THX

Example: https://drone.owncloud.com/owncloud/files_primary_s3/589/42

Error: Call to undefined function Aws\manifest() in /drone/server/apps/files_primary_s3/vendor/aws/aws-sdk-php/src/Api/ApiProvider.php:97
Stack trace:
#0 /drone/server/apps/files_primary_s3/vendor/aws/aws-sdk-php/src/ClientResolver.php(260): OCA\Files_Primary_S3\Vendor\Aws\Api\ApiProvider::defaultProvider(Array)
#1 /drone/server/apps/files_primary_s3/vendor/aws/aws-sdk-php/src/AwsClient.php(161): OCA\Files_Primary_S3\Vendor\Aws\ClientResolver->resolve(Array, Object(OCA\Files_Primary_S3\Vendor\Aws\HandlerList))
#2 /drone/server/apps/files_primary_s3/vendor/aws/aws-sdk-php/src/S3/S3Client.php(263): OCA\Files_Primary_S3\Vendor\Aws\AwsClient->__construct(Array)
#3 /drone/server/apps/files_primary_s3/lib/command/createbucket.php(109): OCA\Files_Primary_S3\Vendor\Aws\S3\S3Client->__construct(Array)
#4 /drone/server/apps/files_primary_s3/lib/command/createbucket.php(72): OCA\Files_Primary_S3\Command\createBucket->getClient()
#5 /drone/server/lib/composer/symfony/console/Command/Command.php(255): OCA\Files_Primary_S3\Command\createBucket->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 /drone/server/lib/composer/symfony/console/Application.php(946): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#7 /drone/server/lib/composer/symfony/console/Application.php(248): Symfony\Component\Console\Application->doRunCommand(Object(OCA\Files_Primary_S3\Command\createBucket), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#8 /drone/server/lib/composer/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#9 /drone/server/lib/private/Console/Application.php(161): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#10 /drone/server/console.php(106): OC\Console\Application->run()
#11 /drone/server/occ(11): require_once('/drone/server/c...')
#12 {main}

Terminal output formatting

I'm not sure if this is a Composer issue, Imposter-plugin issue or PHPCS installer issue, but...

I'm using your awesome typisttech/imposter-plugin package as well as the coding standards packages:

  • dealerdirect/phpcodesniffer-composer-installer
  • phpcompatibility/php-compatibility
  • wp-coding-standards/wpcs

The phpcodesniffer-composer-installer upon install or update is giving details about installed standards which interferes with imposter output.

This results in the following log:

Generating autoload files
Running Imposter...
======================
Loading package information from /var/project-path/composer.json
Imposter operations: 6 transformations
 - Transforming: /var/project-path/vendor/micropackage/requirements/src
 - Transforming: /var/project-path/vendor/micropackage/internationalization/src
 - Transforming: /var/project-path/vendor/micropackage/dochooks/src
 - Transforming: /var/project-path/vendor/micropackage/filesystem/src
 - Transforming: /var/project-path/vendor/micropackage/templates/src
 - Transforming: /var/project-path/vendor/micropackage/templates/src/functions/template.php

Done.
 6/6 [============================] 100%PHP CodeSniffer Config installed_paths set to ../../phpcompatibility/php-compatibility,../../wp-coding-standards/wpcs
Generating optimized autoload filesRunning Imposter...
======================
Loading package information from /var/project-path/composer.json
Imposter operations: 6 transformations
 - Transforming: /var/project-path/vendor/micropackage/requirements/src
 - Transforming: /var/project-path/vendor/micropackage/internationalization/src
 - Transforming: /var/project-path/vendor/micropackage/dochooks/src
 - Transforming: /var/project-path/vendor/micropackage/filesystem/src
 - Transforming: /var/project-path/vendor/micropackage/templates/src
 - Transforming: /var/project-path/vendor/micropackage/templates/src/functions/template.php

Done.
Generated optimized autoload files containing 975 classes

Composer 2 support

I see that the composer-plugin-api is set to 1.1, meaning we cannot use it with v2 of the Composer.

Any plans to make it compatible with it? Is there some way to help make it compatible?

Edit

I've forked it and added

        "composer-plugin-api": "^1.1 || ^2",

To the required field, and all the tests passed 🤷‍♂️

Some well earned appreciation

Just wanted to thank you for releasing this. It works like a charm and saved me quite some time AND is pleasant to work with. Cheers!

Global Installation Issue

I was trying out doing a global installation of this package so I could keep it out of the project requirements, but ran into an issue. It looks like it's attempting to run after being globally installed because I get the error:

Installation failed, reverting ./composer.json and ./composer.lock to their original content.
                          
  [UnexpectedValueException]   
  Imposter namespace is empty

I'm going to look in the code a bit, but I'm hoping it would be easy to make sure that if composer global is being run then the the package won't attempt to run.

Installing Imposter Plugin for the first time gives an error because there's lack of config

Clean directory, not even composer initial files.

$ composer require typisttech/imposter-plugin
Using version ^0.3.1 for typisttech/imposter-plugin
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing typisttech/imposter (0.3.1): Downloading (100%)
  - Installing typisttech/imposter-plugin (0.3.1): Downloading (100%)
Writing lock file
Generating autoload files
Running Imposter...
======================
Loading package information from C:\Users\Kuba\Desktop\composer imposter test/composer.json


  [UnexpectedValueException]
  Imposter namespace is empty


imposter:run

Script @composer imposter:run handling the pre-autoload-dump event returned with error code 1

Installation failed, deleting ./composer.json.

array_merge() exception in ArrayUtil

Detailed description

Followed standard procedure for installing on the readme. Running any composer command afterward results in:


                                                       
  [ErrorException]                                     
  array_merge() expects at least 1 parameter, 0 given  
                                                       

Exception trace:
 () at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/ArrayUtil.php:41
 Composer\Util\ErrorHandler::handle() at n/a:n/a
 array_merge() at n/a:n/a
 call_user_func_array() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/ArrayUtil.php:41
 TypistTech\Imposter\ArrayUtil::flatten() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/ArrayUtil.php:29
 TypistTech\Imposter\ArrayUtil::flattenMap() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/Config.php:56
 TypistTech\Imposter\Config->getAutoloadPaths() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/Config.php:44
 TypistTech\Imposter\Config->getAutoloads() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/ConfigCollection.php:42
 TypistTech\Imposter\ConfigCollection->TypistTech\Imposter\{closure}() at n/a:n/a
 array_map() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/ArrayUtil.php:27
 TypistTech\Imposter\ArrayUtil::flattenMap() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/ConfigCollection.php:43
 TypistTech\Imposter\ConfigCollection->getAutoloads() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter/src/Imposter.php:83
 TypistTech\Imposter\Imposter->getAutoloads() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter-plugin/src/ImposterPlugin.php:106
 TypistTech\Imposter\Plugin\ImposterPlugin->getImposterAutoloads() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter-plugin/src/ImposterPlugin.php:90
 TypistTech\Imposter\Plugin\ImposterPlugin->addAutoloadTo() at /var/www/html/wp-content/plugins/wp-oauth/vendor/typisttech/imposter-plugin/src/ImposterPlugin.php:50
 TypistTech\Imposter\Plugin\ImposterPlugin->activate() at phar:///usr/local/bin/composer/src/Composer/Plugin/PluginManager.php:236
 Composer\Plugin\PluginManager->addPlugin() at phar:///usr/local/bin/composer/src/Composer/Plugin/PluginManager.php:205
 Composer\Plugin\PluginManager->registerPackage() at phar:///usr/local/bin/composer/src/Composer/Plugin/PluginManager.php:261
 Composer\Plugin\PluginManager->loadRepository() at phar:///usr/local/bin/composer/src/Composer/Plugin/PluginManager.php:76
 Composer\Plugin\PluginManager->loadInstalledPlugins() at phar:///usr/local/bin/composer/src/Composer/Factory.php:384
 Composer\Factory->createComposer() at phar:///usr/local/bin/composer/src/Composer/Factory.php:576
 Composer\Factory::create() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:332
 Composer\Console\Application->getComposer() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:444
 Composer\Console\Application->getPluginCommands() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:149
 Composer\Console\Application->doRun() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:127
 Symfony\Component\Console\Application->run() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:100
 Composer\Console\Application->run() at phar:///usr/local/bin/composer/bin/composer:54
 require() at /usr/local/bin/composer:24

Your environment

PHP 7.1
Tried on Ubuntu, WSL(windows subsystem linux), and windows,
composer.json:

  "name": "my-project",
  "description": "private",
  "require": {
    "google/apiclient": "2.1.3",
    "yahnis-elsts/plugin-update-checker": "4.0.3",
    "typisttech/imposter-plugin": "^0.2.6"
  },
  "extra": {
    "imposter": {
      "namespace": "Symphony_Agency_oauth"
    }
  }
}

Error when exclude-from-classmap points to non-existing folder

Hey, I'm having problem with installing Symfony\Process package.

It has the following line in composer.json:

    "autoload": {
        "psr-4": { "Symfony\\Component\\Process\\": "" },
        "exclude-from-classmap": [
            "/Tests/"
        ]
    },

It looks like the Composer distribution does not include this Test folder which causes the following error:

 [UnexpectedValueException]                                                                                                                                                                        
  RecursiveDirectoryIterator::__construct(/Users/johannessiipola/Documents/Projects/searchwp-finnish-base-forms-new-local/app/public/wp-content/plugins/searchwp-finnish-base-forms/vendor/symfony  
  /process//Tests/): failed to open dir: No such file or directory         

I can prevent this error either by creating this folder or removing the line from the package's composer.json.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.