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
880
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
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
170
My Marp Sample
sinoue0108
0
110
Oxlintはいいぞ(続)
yug1224
1
410
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
200
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
540
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
220
VibeCodingからAgenticWorkflowへ
starfish719
0
800
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
720
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
Dockerfile CMD for Node.js
grazie1999
0
120
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
350
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
590
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Build your cross-platform service in a week with App Engine
jlugia
234
19k
A Tale of Four Properties
chriscoyier
163
24k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
310
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
400
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Being A Developer After 40
akosma
91
590k
Why Our Code Smells
bkeepers
PRO
340
58k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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