Bash-Skript zum Ausführen von "pecl install oci8"

5318
Samuel Lindblom

Ich versuche, ein Shell-Skript zu erstellen, das die anfängliche Bereitstellung eines vagrant vm (unter Ubuntu 12.04) durchführt. Alles (php, apache, oracle instantclient usw.) funktioniert gut, außer im letzten Schritt - der Installation der php oci8-Erweiterung:

pecl install oci8 

Wenn ich diesen Befehl manuell ausführe (mit sudo-Präfix), funktioniert das einwandfrei. Wenn das Skript diesen Befehl ausführt, schlägt dies jedoch fehl:

running: make /bin/bash /tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/libtool --mode=compile cc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/oci8/oci8.c -o oci8.lo libtool: compile: cc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/oci8/oci8.c -fPIC -DPIC -o .libs/oci8.o In file included from /tmp/pear/temp/oci8/oci8.c:48:0: /tmp/pear/temp/oci8/php_oci8_int.h:60:17: fatal error: oci.h: No such file or directory compilation terminated. make: *** [oci8.lo] Error 1 ERROR: `make' failed 

Das peclSkript fragt nach einem Pfad am Anfang der Installation, und hier denke ich, ist das Problem:

Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] : 

Um mit der Installation fortzufahren, müssen Sie entweder das Verzeichnis ORACLE_HOME angeben oder drücken Enter. Ich habe Folgendes an anderer Stelle versucht, aber es funktioniert nicht - der Zeilenumbruch fehlt in der Ausgabe (im Vergleich zur peclmanuellen Ausführung des Befehls), so dass der EnterTastenanschlag nicht ordnungsgemäß emuliert wird :

printf "\n" | pecl install oci8 

Irgendwelche Vorschläge, wie ich dies zum Laufen bringen kann?

3
Könnten Sie `echo autodetect | versuchen pecl install oci8`? GnP vor 10 Jahren 0
@gnp Ich habe das ausprobiert und auch `printf" autodetect "` hat nicht geholfen. Samuel Lindblom vor 10 Jahren 0

3 Antworten auf die Frage

3
Phil Porada

Normalerweise können Sie bei dieser Installationsart die Parameter angeben, die Sie einstellen möchten. Ich habe die gesamte Anweisung so verpackt, dass sie mit Sudo-Berechtigungen ausgeführt werden kann

sudo sh -c "echo 'instantclient,/opt/oracle/instantclient' | pecl install oci8" 
2
user301078

Meine Lösung bestand darin, den folgenden Befehl auszuführen:

export C_INCLUDE_PATH=/usr/include/oracle/11.2/client 

und neu starten:

pecl insatlla oci8 
1
Samuel Lindblom

Ich habe keine allgemeine Lösung für dieses Problem gefunden. Was in meinem spezifischen Szenario (Bereitstellung über Vagrant) funktionierte, war die Verwendung eines Puppet-Manifests für diesen spezifischen Bereitstellungsschritt. Dies war einfach, da Sie es nach dem Shell-Bereitstellungsprogramm nur in der Vagrant-Konfiguration angeben müssen:

"pecl-install-oci8": command => "pecl install oci8", user => root, timeout => 0, tries => 5, unless => "/usr/bin/php -m | grep -c oci8"; 

Aus irgendeinem Grund, den ich noch nicht herausgefunden habe, installiert Marionette oci8 ohne Probleme.

Und als ich das getan hatte, portierte ich mein gesamtes Skript in ein Puppet-Manifest, aber das ist nicht das Thema.