Leveraging Composer in Existing Projects

105
Leveraging Composer in Existing Projects Mark Niebergall https://joind.in/talk/774d7

Transcript of Leveraging Composer in Existing Projects

Page 1: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

Mark Niebergallhttps://joind.in/talk/774d7

Page 2: Leveraging Composer in Existing Projects

About Mark Niebergall• PHP since 2005 • Masters degree in MIS • Senior Software Engineer • Drug screening project • UPHPU President • CSSLP, SSCP Certified and SME • Drones, fishing, skiing, father, husband

Page 3: Leveraging Composer in Existing Projects
Page 4: Leveraging Composer in Existing Projects
Page 5: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

Page 6: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

• Survey

- Have heard of composer?

- Are familiar with what composer is?

- Have used composer?

- Have contributed to composer?

Page 7: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

• My experience

- Large project that has been around a while

- Some older code areas

- Various architectural styles over the years

- Various libraries within the project

Page 8: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

• My experience

- Libraries scattered in project

- Some libraries were old

- Some libraries were even altered

Page 9: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

• My experience

- Made the effort to clean up libraries

- Identify libraries and versions

- Created user stories

- Made the migration

Page 10: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

• My experience

- Libraries were organized

- Visibility into libraries used

- Much easier to manage and upgrade

- Much easier to add new libraries

Page 11: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

• Objectives

- Know why and how to use composer

- Leverage composer in your projects

Page 12: Leveraging Composer in Existing Projects

Leveraging Composer in Existing Projects

• Topics

- What composer is

- Using composer

- Migrating libraries

Page 13: Leveraging Composer in Existing Projects

What composer is

Page 14: Leveraging Composer in Existing Projects

What composer is• Created by Nils Adermann and Jordi Boggiano in 2012

• MIT license

Page 15: Leveraging Composer in Existing Projects

What composer is• https://getcomposer.org/

- Installation instructions

- Documentation

Page 16: Leveraging Composer in Existing Projects

What composer is• Dependency manager for PHP projects

Page 17: Leveraging Composer in Existing Projects

What composer is• Tool to manage libraries used by a project

Page 18: Leveraging Composer in Existing Projects

What composer is• Best practice for dependency management for PHP

projects

Page 19: Leveraging Composer in Existing Projects

What composer is• Manage libraries

- Add libraries to project

- Autoload libraries

- Versioning

- Library dependencies

- Remove libraries

Page 20: Leveraging Composer in Existing Projects

What composer is• Uses packagist for package information

- https://packagist.org/

- Submit packages to website

- Versions

- Dependencies

- Location

Page 21: Leveraging Composer in Existing Projects

What composer is• Handles autoloading

- Automatically includes package files when needed

- Use along with other project autoloaders

‣ require_once __DIR__ . ‘/../vendor/autoload.php’;require_once __DIR__ . ‘/../src/Autoloader.php’;

Page 22: Leveraging Composer in Existing Projects

What composer is

Page 23: Leveraging Composer in Existing Projects

Using composer

Page 24: Leveraging Composer in Existing Projects
Page 25: Leveraging Composer in Existing Projects

Using composer• Installing composer

• Adding packages

• Updating packages

• Removing package

Page 26: Leveraging Composer in Existing Projects

Using composer• Installing composer

- Download phar installer file

- Run installer with php

- Move to bin

- curl -s https://getcomposer.org/installer | phpsudo mv composer.phar /usr/local/bin/composer

Page 27: Leveraging Composer in Existing Projects

Using composer• Installing composer

- Windows download https://getcomposer.org/Composer-Setup.exe

Page 28: Leveraging Composer in Existing Projects

Using composer• Installing composer

- php /path/to/composer.phar command

- composer command

Page 29: Leveraging Composer in Existing Projects

Using composer• Installing composer

- Command line tool

- Are some UI helpers

Page 30: Leveraging Composer in Existing Projects

Using composer• composer package versioning

Page 31: Leveraging Composer in Existing Projects

Using composer• composer package versioning

- * = wildcard

- ~ = up to but not including next version

- ^ = up to but not including next major version

Page 32: Leveraging Composer in Existing Projects

Using composer• composer package versioning

- 4.5.2 means only 4.5.2

Page 33: Leveraging Composer in Existing Projects

Using composer• composer package versioning

- 4.5.* means 4.5 and below 4.6

Page 34: Leveraging Composer in Existing Projects

Using composer• composer package versioning

- ~4.5 means >= 4.5 and <5.0

- ~4.5.6 means >= 4.5.6 and < 4.6

Page 35: Leveraging Composer in Existing Projects

Using composer• composer package versioning

- ^4.5 means >= 4.5.0 and < 5

- ^4.5.6 means >= 4.5.6 and < 5

- Default versioning format if not specified

Page 36: Leveraging Composer in Existing Projects

Using composer• composer commands

Page 37: Leveraging Composer in Existing Projects

Using composer• composer commands

- composer init

- composer require

- composer install

- composer update

- composer create-project

- composer remove

Page 38: Leveraging Composer in Existing Projects

Using composer

Page 39: Leveraging Composer in Existing Projects

Using composer• composer init

Page 40: Leveraging Composer in Existing Projects

Using composer• composer init

- Initialize a project with composer

- Creates autoloader

- Define basic settings

- Interactively install packages

- Creates composer.json file

Page 41: Leveraging Composer in Existing Projects

Using composer• composer init

{ "name": “mniebergall/composer", "description": "Leveraging Composer in Existing Projects", "authors": [ { "name": "Mark Niebergall", "email": “[email protected]” } ], "require": {}}

Page 42: Leveraging Composer in Existing Projects

Using composer• composer require

Page 43: Leveraging Composer in Existing Projects

Using composer• composer require

- Add packages to a project

- Install the package plus dependencies

Page 44: Leveraging Composer in Existing Projects

Using composer• composer require

- Adds package to composer.json file

- Creates or updates the composer.lock file

Page 45: Leveraging Composer in Existing Projects

Using composer• composer require

- Package files are saved into the /vendor/ directory

- Autoloader is updated to load the package files automatically

Page 46: Leveraging Composer in Existing Projects

Using composer• composer require

- Only run in development environment

- Not to be used in other environments

Page 47: Leveraging Composer in Existing Projects

Using composer• composer require

- composer require --dev vendor/package

‣ Only installs in development with ‘install’ command

• Testing frameworks (PHPUnit, behat, etc)

• Code analysis and statistics

Page 48: Leveraging Composer in Existing Projects

Using composer• composer require

- composer require --dev phpunit/phpunit "require-dev": { "phpunit/phpunit": "^6.3" }

Page 49: Leveraging Composer in Existing Projects

Using composer• composer require

- composer require --dev fzaninotto/faker

Page 50: Leveraging Composer in Existing Projects

Using composer• composer require

- composer require --dev h4cc/phpqatools

‣ PHPUnit, PHP-Invoker, DbUnit, PHPLOC, PHPCPD, PHP_Depend, PHPMD, PHP_CodeSniffer, Fabien Potencier/PHP Coding Standards Fixer, Sensiolabs/Security-Checker, and Behat

Page 51: Leveraging Composer in Existing Projects

Using composer• composer require

- composer require group/package

‣ See packagist for group/package

‣ Find project on GitHub, read the instructions

• Most will have composer installation command

• If not there are options

Page 52: Leveraging Composer in Existing Projects

Using composer• composer require

- composer require group/package VERSION

- composer require ramsey/uuid

- composer require ramsey/uuid 3.7

- composer require ramsey/uuid=^2.9

- composer require ramsey/uuid ^3.7

Page 53: Leveraging Composer in Existing Projects

Using composer• composer require

{ "name": “mniebergall/composer", "description": "Leveraging Composer in Existing Projects", "authors": [ { "name": "Mark Niebergall", "email": “[email protected]” } ], "require": { "ramsey/uuid": “^3.7" }}

Page 54: Leveraging Composer in Existing Projects

Using composer• composer install

Page 55: Leveraging Composer in Existing Projects

Using composer• composer install

- Installs packages as defined in composer.lock file

- If no lock file then as defined in composer.json

‣ Generates composer.lock file

Page 56: Leveraging Composer in Existing Projects

Using composer• composer install

- composer install --no-dev

‣ Skips require-dev packages

‣ Use this in non-development environments

• We’ll discuss deployment considerations at the end

Page 57: Leveraging Composer in Existing Projects

Using composer• composer install{

- phpsp, add this to composer.json

‣ "require-dev": { "phpspec/phpspec": "^4.0"},"config": { "bin-dir": "bin"},"autoload": {"psr-0": {"": “src”}}

‣ Then run composer install

Page 58: Leveraging Composer in Existing Projects

Using composer• composer update

Page 59: Leveraging Composer in Existing Projects

Using composer• composer update

- Updates packages to latest based on composer.json contents

- Also updates necessary dependencies

- Updates content of composer.json and composer.lock files

Page 60: Leveraging Composer in Existing Projects

Using composer• composer update

- composer update

‣ Update all packages

‣ Not recommended

- composer update group/package

‣ Target specific packages

Page 61: Leveraging Composer in Existing Projects

Using composer• composer update

- composer update group/package version

‣ composer update --dev phpunit/phpunit ^6

Page 62: Leveraging Composer in Existing Projects

Using composer• composer create-project

Page 63: Leveraging Composer in Existing Projects

Using composer• composer create-project

- New project from existing package

- Clones down repo, checkout, installs dependencies

Page 64: Leveraging Composer in Existing Projects

Using composer• composer create-project

- Skeleton projects

- Often used with projects using a framework

- Zend, Laravel, and others

Page 65: Leveraging Composer in Existing Projects

Using composer• composer remove

Page 66: Leveraging Composer in Existing Projects

Using composer• composer remove

- Removing lines from composer.json will not work without a composer update

Page 67: Leveraging Composer in Existing Projects

Using composer• composer remove

- composer remove vendor/package

- Removes entry from composer.json

- Removes entry from composer.lock

- Removes dependencies

- Removes files from vendor directory

Page 68: Leveraging Composer in Existing Projects

Using composer• composer.json

Page 69: Leveraging Composer in Existing Projects

Using composer• composer.json

- Project configuration

- Packages to be used

- Package versions

- Used to generate composer.lock file

Page 70: Leveraging Composer in Existing Projects

Using composer• composer.json

- Can be manually updated

- Can run commands up update it

‣ composer require group/package

Page 71: Leveraging Composer in Existing Projects

Using composer• composer.json

- Define internally hosted packages

- Environment properties

‣ PHP version for compatibility

Page 72: Leveraging Composer in Existing Projects

Using composer• composer.lock

Page 73: Leveraging Composer in Existing Projects

Using composer• composer.lock

- Generated based on contents of composer.json

- Should not be manually edited

- Let composer manage contents

Page 74: Leveraging Composer in Existing Projects

Using composer• composer.lock

- Defines packages and dependencies to be installed

- composer install reads the composer.lock file

Page 75: Leveraging Composer in Existing Projects

Using composer

Page 76: Leveraging Composer in Existing Projects

Migrating libraries

Page 77: Leveraging Composer in Existing Projects

Migrating libraries• Benefits of migrating

• How to migrate

Page 78: Leveraging Composer in Existing Projects

Migrating libraries• Benefits of migrating

- Cleans the codebase

- Project only includes project files

Page 79: Leveraging Composer in Existing Projects

Migrating libraries• Benefits of migrating

- Centralizes library (package) management

- Easier library management

Page 80: Leveraging Composer in Existing Projects

Migrating libraries• Benefits of migrating

- Keep libraries current

‣ Bug fixes

‣ Security patches

‣ Features

‣ Performance

Page 81: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

Page 82: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Use source control

‣ Git (preferred)

‣ Mercurial

Page 83: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Create user stories/tickets to track the progress

Page 84: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Transparency with everyone impacted

‣ Development

‣ QA

‣ Project management

‣ Release team

Page 85: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Identify libraries currently included in project

‣ Frameworks

‣ Tools

‣ Helpful libraries

Page 86: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Identify libraries currently included in project

‣ Search for ‘@license’

‣ Tribal knowledge

Page 87: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Vet libraries found

‣ Consolidation? ex: can framework do that?

‣ Secure?

‣ Altered? Run a compare? If so why?

Page 88: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Vet libraries found

‣ Still needed? ex: deprecated functionality, paragonie/random_compat or PHP 7?

‣ Better library available now?

‣ Best practices?

‣ Built into PHP core? ex: NuSOAP vs PHP Soap

Page 89: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Find the package on packagist

‣ Actively maintained

‣ Popularity

‣ Community acceptance

‣ Documentation

Page 90: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Find the package on packagist

‣ Determine desired version

‣ Review dependencies

‣ Consider alternatives

Page 91: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Review the library source

‣ Unit tests

‣ Coding standards

‣ Time to close open bugs and security issues

‣ Architecturally sound

Page 92: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Steps

‣ Tests

‣ Include the library using composer

‣ Remove old library files from source control

‣ Tests

Page 93: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Steps

‣ Make a pull request

• .gitignore or equivalent ignores /vendor/

• Add changed files, including composer.json and composer.lock

Page 94: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Steps

‣ Make a pull request

• commit

• push

• create PR

Page 95: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Steps

‣ Code reviews

• Automated tests

• Functional tests

• Peer review

Page 96: Leveraging Composer in Existing Projects

Migrating libraries• How to migrate libraries

- Steps

‣ Raise awareness

• QA team

• Project management

• Release team

Page 97: Leveraging Composer in Existing Projects

Migrating libraries

Page 98: Leveraging Composer in Existing Projects

Considerations

Page 99: Leveraging Composer in Existing Projects

Considerations• Handling altered libraries

- Understand why

- Use pure versions

- Make PR to fix issues

- Document what is wrong

Page 100: Leveraging Composer in Existing Projects

Considerations• Testing when updating packages

- composer update vendor/package version

- Domino effect with dependencies

Page 101: Leveraging Composer in Existing Projects

Considerations• Deployment

- composer install —no-dev

- From files

‣ Azer Koçulu case of unpublishing 250+ NPM modules

Page 102: Leveraging Composer in Existing Projects

Considerations• Open discussion

Page 103: Leveraging Composer in Existing Projects

Considerations

Page 104: Leveraging Composer in Existing Projects

Questions?• Rate on joind.in

- https://joind.in/talk/774d7

Page 105: Leveraging Composer in Existing Projects

Sources• https://www.theregister.co.uk/2016/03/23/

npm_left_pad_chaos/

• https://getcomposer.org/