{"id":5305,"date":"2018-06-20T19:44:07","date_gmt":"2018-06-20T17:44:07","guid":{"rendered":"https:\/\/florianbrinkmann.com\/en\/?p=5305"},"modified":"2020-02-09T11:21:37","modified_gmt":"2020-02-09T10:21:37","slug":"travis-ci-php-compatibility","status":"publish","type":"post","link":"https:\/\/florianbrinkmann.com\/en\/travis-ci-php-compatibility-5305\/","title":{"rendered":"Check for compatibility with specific PHP version using Travis CI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">My <a href=\"https:\/\/wordpress.org\/plugins\/lazy-loading-responsive-images\/\">Lazy Loader plugin<\/a> needs PHP 5.3 or higher. If users count on that, it is annoying if this minimum version is raised through a inadvertency (like using the <code class=\"lang-php\">[]<\/code> array syntax) in a patch or minor release.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">To prevent that, I use Travis CI to check my code for compatibility with PHP 5.3.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/github.com\/wimg\/PHPCompatibility\">PHPCompatibility project<\/a> for <a href=\"https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\">PHP_CodeSniffer<\/a> makes it possible to check code for compatibility with a specific PHP version (or multiple versions). The installation is possible with Composer and described in the readme of the project. The <code class=\"lang-markup\">require-dev<\/code> part of my <code class=\"lang-markup\">composer.json looks like that:<\/code><\/p>\n\n\n<pre class=\"wp-block-code lang-javascript\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"require-dev\"<\/span>: {\n    <span class=\"hljs-attr\">\"squizlabs\/php_codesniffer\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>,\n    <span class=\"hljs-attr\">\"wimg\/php-compatibility\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>,\n    <span class=\"hljs-attr\">\"dealerdirect\/phpcodesniffer-composer-installer\"<\/span>: <span class=\"hljs-string\">\"^0.4.4\"<\/span>\n},<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">To check the three class files of my plugin in the <code class=\"lang-markup\">src<\/code> folder, I can use the following command in the root directory of my project after running <code class=\"lang-bash\">composer install<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code lang-bash\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">vendor\/bin\/phpcs -p src\/ --standard=PHPCompatibility --runtime-set testVersion 5.3<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In the best case, the result looks like <code class=\"lang-bash\">... 3 \/ 3 (100%)<\/code> and not something like <code class=\"lang-bash\">.E. 3 \/ 3 (100%)<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This command can be used with Travis <span class=\"smcp\">CI. The <code class=\"lang-markup\">script<\/code> part of my <code class=\"lang-markup\">.travis.yml<\/code> looks like this:<\/span><\/p>\n\n\n<pre class=\"wp-block-code lang-bash\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"YAML\" data-shcb-language-slug=\"yaml\"><span><code class=\"hljs language-yaml\"><span class=\"hljs-attr\">script:<\/span>\n<span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-string\">composer<\/span> <span class=\"hljs-string\">install<\/span>\n<span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-string\">vendor\/bin\/phpcs<\/span> <span class=\"hljs-string\">-p<\/span> <span class=\"hljs-string\">src\/<\/span> <span class=\"hljs-string\">--standard=PHPCompatibility<\/span> <span class=\"hljs-string\">--runtime-set<\/span> <span class=\"hljs-string\">testVersion<\/span> <span class=\"hljs-number\">5.3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">YAML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">yaml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If the check detects an error, the build will fail and I cannot longer skip the <span class=\"smcp\">PHP 5.3 compatibility by mistake ?<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can find <a href=\"https:\/\/github.com\/florianbrinkmann\/lazy-loading-responsive-images\">Lazy Loader on GitHub<\/a>, where you can have a look at the <code class=\"lang-markup\">.travis.yml<\/code> and <code class=\"lang-markup\">composer.json<\/code>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>My Lazy Loader plugin needs PHP 5.3 or higher. If users count on that, it is annoying if this minimum version is raised through a inadvertency (like using the [] array syntax) in a patch or minor release.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wpf_show_in_dewp_planet_feed":false,"flobn_post_versions":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"lazy_load_responsive_images_disabled":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-5305","post","type-post","status-publish","format-standard","hentry","category-web-development"],"wp-worthy-pixel":{"ignored":false,"public":null,"server":null,"url":null},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/5305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/comments?post=5305"}],"version-history":[{"count":5,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/5305\/revisions"}],"predecessor-version":[{"id":5958,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/5305\/revisions\/5958"}],"wp:attachment":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/media?parent=5305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/categories?post=5305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/tags?post=5305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}