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
870
PCRE - Matching Patterns
thomasweinert
0
170
Controlling Arduino With PHP
thomasweinert
2
600
PCRE With PHP
thomasweinert
0
810
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
260
Other Decks in Programming
See All in Programming
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.7k
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.8k
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
840
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
500
Creating Composable Callables in Contemporary C++
rollbear
0
200
初めてのKubernetes 本番運用でハマった話
oku053
0
120
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
120
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
770
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
350
Featured
See All Featured
Leo the Paperboy
mayatellez
8
1.9k
It's Worth the Effort
3n
188
29k
Crafting Experiences
bethany
1
210
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Exploring anti-patterns in Rails
aemeredith
3
440
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Prompt Engineering for Job Search
mfonobong
0
370
A Soul's Torment
seathinner
6
3k
Code Review Best Practice
trishagee
74
20k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
350
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
560
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