Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Build Automation with Phive and Phing
Search
Thomas Weinert
June 01, 2018
Programming
290
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Build Automation with Phive and Phing
PHPUG Cologne 2018-06-01
Thomas Weinert
June 01, 2018
More Decks by Thomas Weinert
See All by Thomas Weinert
Introduction: PHP Extensions
thomasweinert
2
890
PCRE - Matching Patterns
thomasweinert
0
170
Controlling Arduino With PHP
thomasweinert
2
610
PCRE With PHP
thomasweinert
0
820
Modern PHP
thomasweinert
3
260
Controlling Arduino With PHP
thomasweinert
1
190
XPATH WITH PHP AND JS
thomasweinert
0
160
PHPUG CGN: Arduino With PHP
thomasweinert
0
160
IPC 2013: Controlling Arduino With PHP
thomasweinert
0
270
Other Decks in Programming
See All in Programming
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
3
1k
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
110
Oxlintはいいぞ(続)
yug1224
1
540
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.7k
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
160
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
670
Deep dive into the select statement (GopherCon UK)
jespino
0
170
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
670
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
380
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
120
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
360
Building the Perfect Custom Keyboard
takai
2
860
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
Accessibility Awareness
sabderemane
1
200
AI: The stuff that nobody shows you
jnunemaker
PRO
9
970
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.1k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
520
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
490
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
420
WCS-LA-2024
lcolladotor
0
820
Transcript
BUILD AUTOMATION BUILD AUTOMATION WITH PHIVE AND PHING WITH PHIVE
AND PHING @ThomasWeinert
TOOLS FOR PHP TOOLS FOR PHP PHPUnit Phing phpDocumentor phpcs
...
TOOLS FOR A PROJECT TOOLS FOR A PROJECT Which tool?
Which version? How to call? What to do next?
None
COMPOSER COMPOSER Project dependency management Dependency conflicts!
PHIVE PHIVE Tool dependency management Phar packages GPG signatures
INSTALL PHIVE INSTALL PHIVE > wget https://phar.io/releases/phive.phar > wget https://phar.io/releases/phive.phar.asc
> gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9 > gpg --verify phive.phar.asc phive.phar > chmod +x phive.phar > sudo mv phive.phar /usr/bin/phive Shell
THE FIRST CONTACT THE FIRST CONTACT > git checkout
[email protected]
:awesome-project.git
> cd awesome-project > phive install Shell
GPG SIGNATURES GPG SIGNATURES
TOOLS AVAILABLE TOOLS AVAILABLE
PHIVE BASIC USAGE PHIVE BASIC USAGE phive install phive install
tool-name phive update
BUILD TARGETS/GOALS BUILD TARGETS/GOALS Setup Update Deployment ...
PHING PHING based on Apache Ant Phar, installable using Phive
IDE integration (PHPStorm, Netbeans, Eclipse) XML build file Extendable via PHP
IDE INTEGRATION (PHPSTORM) IDE INTEGRATION (PHPSTORM)
CODE COMPLETION CODE COMPLETION
THE FIRST CONTACT II THE FIRST CONTACT II > git
checkout
[email protected]
:awesome-project.git > cd awesome-project > phive install > tools/phing Shell
COMPOSER PROJECT EXAMPLE COMPOSER PROJECT EXAMPLE > composer create-project someone/awesome-project
new-project > cd new-project > phive install > tools/phing > git init && git add * && git commit -m"new project" > tools/phing run Shell
None
PHING TARGETS PHING TARGETS
HELLO WORLD HELLO WORLD <project name="A Project" default="build"> <target name="build">
<echo message="Hello World!"/> </target> </project> XML
A Project > build: [echo] Hello World! BUILD FINISHED Shell
A PROPERTY A PROPERTY <project name="A Project" default="build"> <property name="database.user"
value="username"/> <target name="build"> <echo message="Database User: ${database.user}"/> </target> </project> XML
A Project > build: [echo] Database User: username BUILD FINISHED
Shell
PROPERTIES FILE PROPERTIES FILE <project name="A Project" default="build"> <property file="build.properties"
prefix="configuration"/> <property name="database.user" value="${configuration.database.user}"/> <target name="build"> <echo message="Database User: ${database.user}"/> </target> </project> XML
# Database Configuration database.user=a-user database.password=secret build.properties
[property] Loading /path/build.properties A Project > build: [echo] Database User:
a-user BUILD FINISHED Shell
DISTRIBUTED PROPERTIES FILE DISTRIBUTED PROPERTIES FILE <project name="A Project" default="build">
<property file="dist.build.properties" prefix="configuration"/> <property file="build.properties" prefix="configuration" override="true"/> <property name="database.user" value="${configuration.database.user}"/> <!--...--> </project> XML
# Database Configuration database.user=default-user database.password=secret dist.build.properties
[property] Loading /path/dist.build.properties [property] Loading /path/build.properties [property] Unable to find
property file: /path/build.properties... skipped A Project > build: [echo] Database User: default-user BUILD FINISHED Shell
FILES & DIRECTORIES FILES & DIRECTORIES
FILESET FILESET <fileset id="dependencies" dir="${directory.src}"> <include name="composer.json"/> <include name="composer.lock"/> </fileset>
XML <fileset id="public" dir="${directory.document-root}"> <include name="**"/> <exclude name="**/.git/**"/> </fileset> XML
COPY COPY <target name="build"> <copy todir="${directory.export}/source/htdocs"> <fileset refid="public"/> </copy> <copy
todir="${directory.export}/source"> <fileset refid="dependencies"/> </copy> </target> XML
CREATE DIRECTORY CREATE DIRECTORY <property name="mode.writeable" value="0777"/> <target name="prepare"> <mkdir
dir="${directory.src}/data/cache" mode="${mode.writeable}"/> <mkdir dir="${directory.src}/data/media/files" mode="${mode.writeable}"/> <mkdir dir="${directory.src}/data/media/thumbs" mode="${mode.writeable}"/> </target> XML
REMOVE REMOVE <target name="clean-build"> <delete dir="${directory.export}/source"/> </target> XML <target name="clean-archives">
<delete> <fileset refid="archives"/> </delete> </target> XML
TARGETS TARGETS
DEPENDENCIES DEPENDENCIES <target name="build" depends="prepare"/> <target name="prepare"> <echo message="Hello World!"/>
</target> XML
A Project > prepare: [echo] Hello World! A Project >
build: BUILD FINISHED Shell
DESCRIPTIONS DESCRIPTIONS <target name="build" depends="prepare" description="Build project"/> <target name="prepare"> <echo
message="Hello World!"/> </target> XML
None
HIDDEN HIDDEN <target name="build" depends="prepare" description="Build project"/> <target name="prepare" hidden="yes">
<echo message="Hello World!"/> </target> XML
None
TEMPLATE FILE TEMPLATE FILE
template.configuration.php template.configuration.php <?php define('DATABASE_URI', '${database.uri}'); PHP
EXPAND PROPERTIES EXPAND PROPERTIES <property name="config.template" value="${project.basedir}/template.configuration.php" /> <property name="config.file"
value="${project.basedir}/configuration.php"/> <property name="database.uri" value="sqlite3://project.sqlite" /> <copy file="${config.template}" tofile="${config.file}"> <filterchain> <expandproperties/> </filterchain> </copy> XML
FILTERS FILTERS replacetokens replaceregexp xsltfilter ...
CONDITION CONDITION <condition property="directorySeparator" value="\" else="/"> <os family="windows"/> </condition> <echo
message="Directory Separator: ${directorySeparator}"/> XML
FILE EXISTS FILE EXISTS <property name="hasConfiguration" value="false"/> <available file="${config.file}" property="hasConfiguration"
value="true"/> XML
CONDITION CONDITION <if> <isfalse value="${hasConfiguration}"/> <then> <copy file="${config.template}" tofile="${config.file}"> <filterchain>
<expandproperties/> </filterchain> </copy> </then> <else> <warn message="configuration.php already exists. Skipped."/> </else> </if> XML
RUN 1 RUN 1 A Project > build: [copy] Copying
1 file to /project/path/ BUILD FINISHED Shell
RUN 2 RUN 2 A Project > build: [warn] configuration.php
already exists. Skipped. BUILD FINISHED Shell
EXECUTE TOOLS EXECUTE TOOLS
COMPOSER INSTALL COMPOSER INSTALL <exec executable="composer" passthru="true"> <arg value="-n"/> <arg
value="install"/> </exec> XML
GIT TAG GIT TAG <property name="revision" value="dev"/> <exec executable="git" dir="${project.basedir}"
returnProperty="git.return" outputProperty="git.output"> <arg line="describe --tags"/> </exec> <if> <equals arg1="${git.return}" arg2="0"/> <then> <property name="revision" value="${git.output}" override="true"/> </then> </if> XML
GIT DESCRIBE GIT DESCRIBE A Project > project-revision: [echo] Project
revision: 4.0.1-14-g7597c11 BUILD FINISHED Shell
PHP BUILTIN WEBSERVER PHP BUILTIN WEBSERVER <exec executable="php" passthru="true"> <arg
line="-S localhost:8080 -t ./htdocs server.php"/> </exec> XML
COMPOSER PACKAGE VERSION COMPOSER PACKAGE VERSION
DEFINE ADHOC TASK DEFINE ADHOC TASK <adhoc-task name="composer-version"> <![CDATA[ class
AVersionTask extends Task { function main() { $json = json_decode(file_get_contents("composer.lock")); foreach ($json->packages as $package) { if ($package->name === 'carica/io') { $this->project->setProperty( 'revision', $package->version.' '.substr($package->source->reference, 0, 8) ); } } } } XML
USE ADHOC TASK USE ADHOC TASK <property name="revision" value=""/> <trycatch
property="error"> <try> <adhoc-task name="composer-version">...</adhoc-task> <composer-version/> <echo message="Revision: ${revision}"/> </try> <catch> <echo level="warning">There was an error...</echo> <echo level="debug">${error}</echo> <property name="revision" value="unknown" override="true"/> </catch> </trycatch> XML
A Project > package-revision: [echo] Revision: 1.0.0 8f996060 BUILD FINISHED
Shell
A Project > package-revision: [PHP Error] file_get_contents(composer.lock): failed to open
s [PHP Error] Invalid argument supplied for foreach() [line 6 of [echo] Revision: BUILD FINISHED Shell