Vorschläge für settings.php - Lokaler Entwickler, Entwicklungsserver, Live-Server

80

Grundsätzlich eine der größten Fragen aller Zeiten: Wie verwenden Sie settings.php in Ihrem Entwicklungs- / Staging-Workflow?

Im Moment habe ich meine settings.php-Datei wie folgt eingerichtet und meine Entwicklung basiert auf der $ HOST-Direktive des Servers - das heißt, ich kann auf dev.example.com für den (gemeinsam genutzten) Entwicklungsserver local.example arbeiten. com für meinen lokalen Computer (und die lokalen Code-Checkouts anderer Entwickler) und www.example.com (oder nur example.com) für die Live-Site.

(Dieser Code befindet sich im Abschnitt 'Datenbankeinstellungen' von settings.php):

$host = $_SERVER['HTTP_HOST'];
$base_url = 'http://'.$host;
$cookie_domain = $host;

switch($host) {
  case 'example.com': # Production server
    $db_url = 'mysqli://prod_sql_user:[email protected]/prod_db';
    $update_free_access = FALSE;
    $conf = array (
      // Set production config options here...
      'example_setting' => 0,
    );
    break;

  case 'dev.example.com': # Development server
    $db_url = 'mysqli://dev_sql_user:[email protected]/dev_db';
    $update_free_access = FALSE;
    $conf = array (
      // Set production config options here...
      'example_setting' => 0,
    );
    break;

  case 'local.example.com': # Local server
    $db_url = 'mysqli://local_sql_user:[email protected]/local_db';
    $update_free_access = FALSE;
    $conf = array (
      // Set production config options here...
      'example_setting' => 0,
      // Turn off most core caching.
      'cache_inc' => 'includes/cache.inc',
      'cache' => CACHE_DISABLED,
    );
    break;

}
?>

Dies funktioniert für die meisten Zwecke recht gut, aber es bedeutet, dass in unserer gemeinsam genutzten settings.php-Datei eine Menge irrelevanter Code herumsteht ... gibt es einen besseren Weg?

Geerlingguy
quelle
Sie sollten die Drupal-Lösung für mehrere
sobi3ch

Antworten:

66

Ich trenne diese Datei in eine settings.php und eine local.settings.php.

Am Ende von settings.php steht der folgende Code:

if (file_exists(dirname(__FILE__) . '/local.settings.php')) {
  include dirname(__FILE__) . '/local.settings.php';
}

Die lokale Datei wird dann von dem von Ihnen verwendeten VCS ausgeschlossen. Der Vorteil ist, dass Sie Einstellungen, die für alle Instanzen gleich sind, in settings.php ablegen und diese automatisch versionieren / verteilen lassen und die lokalen Inhalte in local.settings.php behalten können.

Berdir
quelle
2
Dies ist eigentlich die Strategie, die auf drupal.org selbst angewendet wird und die wir bei Palantir.net konsequent anwenden. Für einen Bikeshed empfehle ich die Verwendung von 'settings.local.php' als Dateinamen, da dies dem von 'settings.default.php' festgelegten Muster entspricht.
Dave Reid
1
Ich habe eine Liste dafür erstellt: gist.github.com/1235389 seitdem ich diese immer häufiger
benutze
4
Hinweis: Drupal 8 hat der Einstellungsdatei nun standardmäßig einen ähnlichen Ausschnitt hinzugefügt. Sie müssen ihn nur noch auskommentieren
Berdir
1
@ DaveReid: Das Muster wird durch ' default.settings.php ' und nicht durch 'settings.default.php' festgelegt.
Iconoclast
1
Für funsies könntest du (__DIR__)statt dirname(__FILE__). Sie sind gleichwertig .
CDMO
26

Anscheinend erfinden Sie die integrierte Multisite-Funktionalität von Drupal neu.

Persönlich behalte ich alle Standardthemen und -module für die Site bei sites/allund habe dann sites/dev.example.comund sites/example.com.

Als zusätzlichen Bonus können Sie dann verschiedene filesOrdner für jede Site haben und Sie können auch beliebige Entwicklungsmodule hinzufügen sites/dev.example.com/modules.

Paul Jones
quelle
Das macht Sinn, aber ich habe einige Sites, auf denen es bereits 5-10 Ordner mit mehreren Standorten gibt, und es kann ziemlich ärgerlich sein, alle Themen für diese Sites in sites / all / themes zu haben. Ganz zu schweigen von meiner typischen Verwendung von custom.module für jede Site. Ich denke, ich könnte stattdessen sitename_custom.module verwenden: - /
geerlingguy
2
Sie können immer versuchen, symbolische Links von sites/dev.example.com/modulesbis zu zu verwendensites/example.com/modules
Paul Jones
Akzeptiere diese Antwort - Ich werde dies auf der Site versuchen, an der ich gerade arbeite. Sieht nach einer guten Anpassung an meinen Workflow aus.
Geerlingguy
9
Ich denke, dies ist eine schlechte Möglichkeit, mit Entwicklungs- und Staging-Umgebungen umzugehen, da es sich nicht um unterschiedliche / separate Sites handelt, sondern nur um unterschiedliche Versionen derselben Site. In diesem Fall möchten Sie unbedingt vermeiden, dass für jede Site separate Dateien vorhanden sind. Ich würde sehr empfehlen, die unten erwähnte Methode zu verwenden, bei der settings.php versioniert wird und die für jede Site spezifischen Einstellungen (DB-Einstellungen) in einer local.settings.php gespeichert werden, die nicht versioniert ist.
Mikey P
1
@Mikey P - beide Lösungen sind gültig - ich denke, es hängt hauptsächlich von der persönlichen / Team-Präferenz ab ... meiner Meinung nach gibt es Kompromisse mit beiden Ansätzen.
Geerlingguy
10

Ich bevorzuge es, die Datei lokal zu ignorieren (mit einer .gitignoreDatei in Git) und dann separate Versionen zu behalten, wenn die Datei auf jedem Host ist.

ack
quelle
1
Dies ist eine interessante Lösung, obwohl ich gern settings.php in git verfolge (einige Fehler, die ich hatte, sind auf setting.php-Änderungen zurückzuführen ...). Gibt es eine Möglichkeit, diese Datei durch meine lokale Git-Prüfung durch meine eigene zu ersetzen (abgesehen davon, dass ich sie in meine eigene Datei kopiere)?
Geerlingguy
1
Das mache ich auch. Dateien mit Konfigurationsdaten, insbesondere mit Datenbankanmeldeinformationen, haben keinen Platz im VCS.
mmartinov
@geerlingguy ja du kannst. Bitte lies mein Update (falls es veröffentlicht wird;)
sobi3ch
@martin Ich stimme zu, aber vergessen wir nicht, dass wir SPECIAL separate Repos nur für DIESE Datei haben können! Sie können es in meinem Update lesen.
sobi3ch
7

Ich neige dazu, immer DNS- oder Host-Dateieinträge einzurichten und zu verwenden

dev.example.com
staging.example.com

und

example.com

Dann habe ich völlig getrennte Einstellungsdateiverzeichnisse mit unterschiedlichen Dateiverzeichnissen. Zum Beispiel ./sites/dev.example.com/files

Stewart Robinson
quelle
Das Problem, das ich bei diesem Ansatz sehe, ist, dass ich häufig ein / themes / und / modules / -Verzeichnis habe, das ich für jede Site verwende (oft in einem Multisite-Setup), und da ich diese sitespezifischen Module und Themen für local verwenden muss , Entwickler und Produzent, ich kann nicht einfach so Hosts / Multisites machen: - /
Geerlingguy
Guter Punkt. Ich denke, ich habe ausgelassen, dass ich das Zeug in symlink.
Stewart Robinson
Auf diese Weise können Sie einen Symlink erstellen und Themen- und Modulordner freigeben. Im Grunde genommen ist Ihr Hauptordner ein Produktionsordner und Sie können daraus Symlinks zu Stage, Dev und Local erstellen.
Gansbrest
5

Warum nicht ein paar Ordner basierend auf dem Namen des Entwicklungshosts?

Beispiel

  • sites / dev1.domain.com
  • sites / dev2.domain.com
  • sites / dev3.domain.com
  • sites / www.domain.com

Jede mit ihrer eigenen Einstellungsdatei und db_url.

Kevin
quelle
Mögliches Problem: In einem Site-Ordner gespeicherte / hochgeladene Dateien sind für andere nicht zugänglich.
Greg
Siehe meine Antwort an @Stewart :)
Geerlingguy
Erstellen Sie Symlinks zum zentralen Ordner "files"
Kevin
2

Wenn sich nur die Datenbankanmeldeinformationen ändern, können Sie Umgebungsvariablen in Ihrer lokalen (und Staging- / Produktions-) virtuellen Hostkonfiguration oder in einem .htaccess-Ordner über Ihrem Webstamm festlegen. Hier ist ein einfaches Beispiel:

/var/www/example.com/drupal-resides-here

Ich kann dann hier eine .htaccess-Datei erstellen:

/var/www/example.com/.htaccess

welches den folgenden Code hat:

SetEnv DB1_USER my_local_user
SetEnv DB1_PASS my_local_pass
SetEnv DB1_HOST my_local_host
SetEnv DB1_NAME my_local_dbname

Dann können Sie in /var/www/example.com/drupal-resides-here/sites/default/settings.php(oder was auch immer) die DB-Anmeldeinformationen wie folgt abrufen:

$db_url = "mysql://{$_SERVER['DB1_USER']}:{$_SERVER['DB1_PASS']}@{$_SERVER['DB1_HOST']}:{$_SERVER['DB1_PORT']}/{$_SERVER['DB1_NAME']}";

Auf diese Weise können mehrere Entwickler Dinge lokal ausführen und Sie können auf Staging / Produktion umsteigen, während Sie die settings.php verfolgen (es sind mehr Dinge enthalten als nur die Datenbankanmeldeinformationen ...). Sie müssten auch nicht mehrere settings.php-Dateien im Auge behalten.

Charlie Schliesser
quelle
Ich persönlich denke, das ist der beste Weg. In unserem Setup fügen wir jedoch die SetEnv-Anweisungen zur Apache-Konfiguration hinzu. Macht es ein bisschen sicherer.
Scott Joudry
Dies ist eine interessante Verwendung für .htaccess- und Variablenspeicher. Aber was ist, wenn du rennst drush up --y? Dadurch wird Ihre Basis-.htaccess-Datei überschrieben.
Screenack
Dies geschieht in einer .htaccessDatei, die über der Webroot-Ebene liegt. Zum Beispiel /var/www/.htaccessspeichert diese Direktiven und /var/www/drupal/.htaccesswäre Drupal .htaccess. Sie können es auch einfach in die Konfiguration des virtuellen Apache-Hosts einfügen, was noch besser ist. Unabhängig davon haben wir fast immer benutzerdefinierte Inhalte in den Webroots .htaccessund wenn wir Drupal aktualisieren, müssen wir die .htaccessÄnderungen mit Git vergleichen.
Charlie Schliesser
0

Die einfachste und effizienteste Lösung, bei der es sich nur um eine Zeile handelt, ist die folgende. Fügen Sie es einfach in die letzte Zeile Ihrer settings.php-Datei ein:

@include('settings.local.php');

Das @ -Symbol auf der Vorderseite bedeutet nur, dass kein Fehler angezeigt wird, auch wenn diese Datei nicht gefunden wird. Typische Setups wie dieses erfordern eine Bedingung, um zu prüfen, ob die Datei vorhanden ist. Dies erreicht es in einer Zeile ohne es.

http://php.net/manual/en/language.operators.errorcontrol.php

Wird auch als STFU-PHP-Operator bezeichnet .

Patoshi パ ト ト
quelle
Einfach, aber ich denke nicht die effizienteste. seanmonstar.com/post/909029460/…
AyeshK