eclipse/PDT automatischer FTP Upload beim Speichern

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (8 Stimmen, Durchschnitt: 4,50 von 5)
Loading...

Sehr lange habe ich mich mit dem Thema beschäftigt, aus eclipse heraus direkt beim Speichern einen FTP Upload der geänderten Datei durchzuführen. Bisher habe ich dafür die Software Fling File Transfer benutzt. Da diese aber in den neueren Versionen scheinbar einen Memory Leak hat und die alten nicht unter Windows 8 laufen, musste eine Alternative her.

Ich habe nun weitere Produkte wie PureSync oder SyncBackPro getestet, aber keines der Tools kam a) an die Geschwindigkeit von Fling heran. Da ich selbst mit eclipse arbeite kam mir sogar mal kurzzeitig der Gedanke auf eine andere Entwicklungsumgebung umzusteigen. Kostenpflichtig gabs da Adobe Dreamweaver, welches den FTP Upload unterstützt. Kostenlos gabs Aptana. Das hat mir recht gut gefallen, da Aptana auf eclipse basiert.

Also Aptana heruntergeladen, entpackt und alle Projekte konvertiert und FTP Upload eingerichtet. Funktionierte super. Bis ich dann das erste mal damit arbeiten musste. Kein passendes Farbschema was für alle Editoren passte usw. Ich war unzufrieden. Also wieder zurück zu eclipse.

Wer in Google nach „Eclipse automatic FTP Upload on file change“ sucht wird oftmals auf RSE verwiesen, den Remote System Explorer. Aber das war nicht das, was ich suchte. Kommen wir nun aber zum Ergebnis, die Lösung ist ANT zu benutzen. Im folgenden erkläre ich wie man ANT in einem PHP Projekt konfiguriert und einsetzt.

Kapitel: Eclipse für ANT & FTP vorbereiten

Alle folgenden Bilder/Anleitungen basieren auf eclipse Kepler. Benutzt wird hier die Standardversion von eclipse. Damit ANT funktioniert müssen ggf. noch Pakete nachinstalliert werden. Dazu auf Help -> Install new Software -> als Site unter Work with -> „Kepler – http://download.eclipse.org/releases/kepler“ auswählen. Dort dann unter General Purpose Tools -> „Eclipse plug-in development environment.“ Ggf. ist das Paket schon durch SVN oder andere Tools installiert.

eclipse software

Nun benötigen wir noch 2 Libs die wir ins eclipse Verzeichnis kopieren müssen. Downloaden Sie von der Apache Webseite das commons-net (aktuell commons-net-3.3-bin.zip) Paket. In dem ZIP File finden Sie nun die Datei „commons-net-3.3.jar„. Kopieren Sie diese ins eclipse Verzeichnis.

Kopieren Sie weiterhin aus dem Java JDK (sofern nicht installiert, installieren Sie die neuste Version) die Datei tools.jar. Diese findet sich in diesem Pfad: C:\Program Files\Java\jdk1.7.0_45\lib. (ggf. Versionsnummer bei Ihnen anpassen.

Diese 2 Dateien müssen nun ANT noch als classpath hinzugefügt werden. Dazu klicken Sie in eclipse auf Window -> Preferences -> ANT -> Runtime. Klicken Sie dort dann auf „Ant Home Entries (Default)“ und wählen rechts „Add external JARs“ Wählen Sie nun die beiden Dateien aus. Sofern Sie zuerst die commons-net Datei wählen, wird Ihnen ein Hinweis angezeigt, dass die tools-lib noch fehlt. Bestätigen Sie dies und fügen Sie auf dem gleichen Wege die tools.lib hinzu.

perferences

Prüfen Sie nun ob unter Window -> Show View -> Other -> ANT verfügbar ist. Falls ja, wählen Sie diese dort aus. Die View sollte sich nun im unteren Bereich neben der Console/Tasks andocken.

Ggf. muss ANT noch manuell aktiviert werden. Dazu klicken Sie auf File -> New -> Other -> öffnen Sie den Java Ordner -> Java Project from Existing Ant Buildfile. Klicken Sie auf Next. Sollte nun ein Dialog mit der Frage „Always enable activities and don´t ask me again“ erscheinen, bestätigen Sie diesen. Danach brechen Sie den Assistenten ab.

Kapitel: ANT Konfigurationen anlegen (build.xml/build.properties)

Nun benötigen wir 2 neue Config-Files für das Projekt. Legen Sie im Projekt Ordner eine build.xml sowie eine build.properties Datei an. Füllen Sie diese mit folgenden Inhalten. Auf die einzelnen Optionen gehe ich später ein:

build.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="MyProject">
  3.   <property file="build.properties" />
  4. 	<target name="ftp-dev" description="ftpDev">
  5. 	<echo>Uploading files to "${ftp.dev.server}" ftp</echo>
  6. 		<ftp  server    = "${ftp.dev.server}"
  7. 		      userid    = "${ftp.dev.user}"
  8. 		      password  = "${ftp.dev.password}"
  9. 		      remotedir = "${ftp.dev.remotedir}"
  10. 		      passive   = "yes"
  11. 		      binary    = "yes"
  12. 		      depends   = "no"
  13. 		      verbose   = "yes"
  14. 		      action    = "put">
  15. 		    <fileset dir="${local.dir}">
  16. 		      <exclude name=".settings/" />
  17. 		      <exclude name="**/.svn/" />
  18. 		      <exclude name="build.xml" />
  19. 		      <exclude name=".project" />
  20. 		      <exclude name=".buildpath" />
  21. 		      <exclude name=".externalToolBuilders/" />
  22. 		      <exclude name="*.properties" />
  23. 		      <modified cache="propertyfile">
  24. 		    	<param name="cache.cachefile" value="cache-dev.properties"/>
  25. 		      </modified>
  26. 		    </fileset>
  27. 		</ftp>
  28. 	</target>
  29. 	<target name="ftp-prod" description="ftpProd">
  30. 	  <echo>Uploading files to "${ftp.prod.server}" ftp</echo>
  31. 	    <ftp  server    = "${ftp.prod.server}"
  32. 	          userid    = "${ftp.prod.user}"
  33. 	          password  = "${ftp.prod.password}"
  34. 	          remotedir = "${ftp.prod.remotedir}"
  35. 	          passive   = "yes"
  36. 	          binary    = "yes"
  37. 	          depends   = "no"
  38. 	          verbose   = "yes"
  39. 	          action    = "put">
  40. 	        <fileset dir="${local.dir}">
  41. 	          <exclude name=".settings/" />
  42. 	          <exclude name="**/.svn/" />
  43. 	          <exclude name="build.xml" />
  44. 	          <exclude name=".project" />
  45. 	          <exclude name=".buildpath" />
  46. 	          <exclude name=".externalToolBuilders/" />
  47. 	          <exclude name="*.properties" />
  48. 	          <modified cache="propertyfile">
  49. 	            <param name="cache.cachefile" value="cache-prod.properties"/>
  50. 	          </modified>
  51. 	        </fileset>
  52. 	    </ftp>
  53. 	  </target>
  54. </project>

build.properties

  1. #Ftp settings DEV Stage
  2. ftp.dev.server=devhostname
  3. ftp.dev.user=username
  4. ftp.dev.password=password
  5. ftp.dev.remotedir=/path/to/remote/folder/
  6.  
  7. #Ftp settings PROD Stage
  8. ftp.prod.server=prodhostname
  9. ftp.prod.user=username
  10. ftp.prod.password=password
  11. ftp.prod.remotedir=/path/to/remote/folder/
  12.  
  13. #Local Settings
  14. local.dir=C:/dev/www/html

Gehen wir zuerst auf die build.xml ein. Variablen werden wie folgt definiert: ${local.dir} Diese Variablen müssen dann in der build.properties hinterlegt sein. Die Benennung der Variablen ist komplett Ihnen überlassen. Es gibt keine Namensräume oder ähnliches. Damit das build.xml die Property Datei kennt wird diese via Tag angegeben.

Nun folgen die Targets. Es können verschiedene Targets angegeben werden. In unserem Beispiel gibt es ein Target für den FTP-Upload auf den Entwicklungsserver und einen FTP Upload auf den Produktivserver. Der AutoUpload wird später nur für den Entwicklungsserver aktiviert, könnte aber auch parallel direkt auf den Produktivserver schreiben. Effektiv sind beide Targets identisch bis auf die Variablennamen, wir benötigen ja andere Zugangsdaten, sowie der Targetname unterscheidet sich.

Innerhalb des Targets gibt es einen echo Befehl der in der Console Text ausgibt. Danach folgt der FTP-Konfigurations Abschnitt. Die Werte sind eigentlich selbsterklärend. Ein komplettes Handbuch zu den FTP Konfigurationen (Alle Werte innerhalb des Tags) finden Sie in in der offizielle Apache Dokumentation.

Zu erwähnen ist hier eigentlich nur der Wert „depends„. Dieser soll eigentlich nur die neuen Dateien hochladen, die sich seit dem letzten Build geändert haben. Hier bin ich auf diverse Probleme gestoßen. Eclipse geht hier beim Build hin und vergleicht den Timestamp der Dateien auf dem FTP mit dem lokalen Timestamp. Auf dem FTP Server werden die TimeStamps nur in Minuten angegeben. Das bedeutet, die Datei wird nur jede Minute neu hochgeladen. Speichert man also in Sekunde 12 der Minute, muss man 48 Sekunden warten und erneut speichern, bevor die Datei hochgeladen wird. Zusätzlich gibt es hier jede Menge Probleme mit den Zeitzonen Einstellungen des FTP Server sowie Sommerzeit/Winterzeit Probleme. Daher steht der Wert hier auch auf „no„. Das Problem lösen wir aber anders 🙂

Der Bereich rund um <fileset> beschreibt welche Dateien wir lokal per FTP hochladen wollen. Über „dir“ und der passenden Variable wird der lokale Pfad angegeben. Theoretisch dürften auch relative Pfade funktionieren, habe ich aber nicht getestet. Innerhalb des Tags finden sich nun noch <exclude> Tags. Damit können wir explizit Dateien & Ordner ausschließen. Der exclude Tag ist sehr komplex und kann über diverse Pattern auch deutlich komplexere Ausschlüsse darstellen. Auch hier finden Sie alle Infos in der offiziellen Apache Dokumentation.

Kommen wir nun zur Alternativen Lösung für das depends im ftp Block. Die Lösung hier ist der <modified> Block. Damit legt ANT einen lokalen Cache (cache-dev.properties) an und speichert wann welche Datei modiziert wurde. Da wir 2 Targets nutzen, teilen wir ANT mit, dass es auch 2 verschiedene Cache Files benötigt. Damit wird nach jedem Build der Cache aktualisiert und nur noch die Dateien selektiert, welche sich seither verändert haben. Weitere Informationen finden Sie in der offiziellen Apache Dokumentation.

Damit sind wir mit der Konfiguration der 2 Dateien fertig und können nun beginnen, das Skript in eclipse einzurichten.

Kapitel: ANT einrichten

Öffnen Sie nun die ANT View am unteren Bildschirmrand, falls noch nicht geschehen. Ziehen Sie nun via Drag’n’Drop die build.xml aus Ihrem Projekt Ordner in die View. Dies sollte nun so aussehen:

ant_view

Jetzt können Sie „ftp-dev“ auswählen und rechts oben in der View auf den grünen Play Knopf klicken. Ist alles richtig eingerichtet, wechselt die Ansicht auf den Reiter Console und zeigt dann folgendes an:

console

In dem Fall zeigt der Screenshot zwar „0 files sent“ an, in Ihrem Fall müsste er jetzt einmal alle Dateien übertragen und die Cache Datei anlegen. Beim nächsten Ausführen zeigt er auch bei Ihnen 0 files an. Ändern Sie nun eine Datei und führen den Job erneut aus, übertragt er diese 1 Datei.

Kapitel: AutoBuild oder Automatischer FTP Upload

Nun kommen wir zum eigentlichen Teil des Artikels, dem automatischen Upload. Dazu müssen wir erst den Auto Build in Eclipse aktivieren. Dazu wählen Sie in der Menüleiste Project -> Build automatically.

auto_build

Jetzt müssen wir die Einstellungen vom Projekt noch anpassen. Dazu klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Properties und wählen links in den möglichen Optionen „Builders„. Klicken Sie nun rechts den Button Import. Dort sollte nun Ihre angelegte build.xml erscheinen. Wählen Sie diese aus. Es sollte nun wie folgt aussehen:

properties

Wählen Sie ihren neuen Eintrag mit build.xml aus und klicken rechts auf Edit. Wechseln Sie in den Reiter Targets. Klicken Sie beiden ersten 3 Zeilen jeweils rechts den Button „Set Targets“ und wählen in dem Dialog dann „ftp-dev“ aus. Es sollte nun wie folgt aussehen:

builder_config

Bestätigen Sie den Dialog mit OK und schließen Sie danach die Properties des Projekts. Ab sofort sollte bei einem ändern einer Datei oder hinzufügen/löschen einer Datei automatisch der Build gestartet werden und damit unser FTP Upload Skript.

Viel Spaß mit eclipse und dem builtin FTP Upload ohne Extra-Werkzeuge/Software.