CLI Başvurusu
merql, anlık görüntüler almak, farkları hesaplamak ve birleştirmeleri doğrudan terminalden çalıştırmak için bir CLI ile birlikte gelir. Composer, bunu vendor/bin/merql olarak kurar; merql deposunun yerel kopyasında ise bin/merql olur.
vendor/bin/merql, merql 0.4.1 olduğundan bir bağımlılık olarak kurulduğunda da çalışır. Önceki sürümler, Composer yükleyicisini yalnızca paketin kendi vendor/ dizininde aradığından merql bir bağımlılık olarak kurulduğunda başarısız oluyordu.
Hızlı başlangıç
# Capture a baseline from your database.
export MERQL_DB_DSN="sqlite:/path/to/db.sqlite"
vendor/bin/merql snapshot base
# Make some changes, then capture again.
vendor/bin/merql snapshot current
# See what changed.
vendor/bin/merql diff base current
Üç yönlü birleştirme için ours ve theirs, base'den ayrışmış iki veritabanından alınmış olmalıdır. Her anlık görüntü için MERQL_DB_DSN öğesini doğru veritabanına yönlendirin:
# Base: live before the sandbox was copied from it.
MERQL_DB_DSN="sqlite:/data/live.sqlite" vendor/bin/merql snapshot base
# ... copy live.sqlite to sandbox.sqlite, then both databases change ...
MERQL_DB_DSN="sqlite:/data/sandbox.sqlite" vendor/bin/merql snapshot ours
MERQL_DB_DSN="sqlite:/data/live.sqlite" vendor/bin/merql snapshot theirs
# Three-way merge with dry-run preview.
vendor/bin/merql merge base ours theirs --dry-run
Üç anlık görüntünün tamamını aynı veritabanından art arda almak birleştirme olarak işe yaramaz: theirs, ours'un değişikliklerini zaten içeriyor olur ve ours'un eklediği her satır insert_insert çakışması olarak bildirilir.
Ortam değişkenleri
CLI, veritabanı bağlantı ayrıntılarını ortam değişkenlerinden okur. PDO DSN dizgesiyle veya ayrı MySQL parametreleriyle bağlanabilirsiniz.
DSN tabanlı bağlantı
PDO tabanlı bağlantılar için MERQL_DB_DSN kullanın. Bu, SQLite ve standart dışı yapılandırmalar için önerilen yaklaşımdır. DSN, bir MySQL veya SQLite veritabanını göstermelidir: CLI, başka altyapılar için sürücü kaydedemez.
| Değişken | Açıklama | Örnek |
|---|---|---|
MERQL_DB_DSN |
Tam PDO DSN dizgesi | sqlite:/path/to/db.sqlite |
MERQL_DB_USER |
Kullanıcı adı (DSN ile isteğe bağlı) | root |
MERQL_DB_PASS |
Parola (DSN ile isteğe bağlı) | secret |
# SQLite file.
export MERQL_DB_DSN="sqlite:/var/data/myapp.sqlite"
# MySQL via DSN.
export MERQL_DB_DSN="mysql:host=127.0.0.1;dbname=mydb;charset=utf8mb4"
export MERQL_DB_USER="root"
export MERQL_DB_PASS="secret"
Dosya tabanlı bir SQLite veritabanı kullanın. Her CLI komutu kendi sürecinde çalışır; bu nedenle
sqlite::memory: her zaman yeni ve boş bir veritabanı açar ve bunun anlık görüntüsünde
tablo bulunmaz.
MySQL kısa yolu
MERQL_DB_DSN ayarlanmamışsa, CLI MySQL'ye özgü değişkenleri kullanır.
| Değişken | Varsayılan | Açıklama |
|---|---|---|
MERQL_DB_NAME |
(zorunlu) | Veritabanı adı |
MERQL_DB_HOST |
127.0.0.1 |
MySQL ana makinesi |
MERQL_DB_PORT |
3306 |
MySQL bağlantı noktası |
MERQL_DB_USER |
root |
MySQL kullanıcı adı |
MERQL_DB_PASS |
(boş) | MySQL parola |
MERQL_DB_ADAPTER |
pdo |
mysqli adaptörünü kullanmak için mysqli olarak ayarlayın |
export MERQL_DB_NAME="wordpress"
export MERQL_DB_HOST="127.0.0.1"
export MERQL_DB_PORT="3306"
export MERQL_DB_USER="root"
export MERQL_DB_PASS="password"
Komutlar
merql snapshot <name>
Ortam değişkenlerinde belirtilen veritabanının mevcut durumunu yakalayın ve adlandırılmış bir anlık görüntü olarak kaydedin. Veritabanına bağlanan tek komut budur.
vendor/bin/merql snapshot baseline
Çıktı:
Snapshot 'baseline' saved
Tables: posts, comments, users, settings
Anlık görüntüler, çalışma dizininin altındaki .merql/snapshots/ konumunda JSON dosyaları olarak saklanır (bkz. Anlık görüntü depolama). Ad yalnızca alfasayısal karakterler, tireler ve alt çizgiler içerebilir.
Tipik iş akışı: değişiklik yapmadan önce bir anlık görüntü alın, ardından değişikliklerden sonra bir tane daha alın. Bu iki anlık görüntü, fark veya birleştirme işleminin temelini oluşturur.
merql diff <base> <current>
Adlandırılmış iki anlık görüntüyü karşılaştırın ve farklılıkların özetini görüntüleyin.
vendor/bin/merql diff baseline current
Çıktı:
Changeset: baseline -> current
Inserts: 3
Updates: 7
Deletes: 1
Her iki anlık görüntü de önceden alınmış olmalıdır (merql snapshot ile). Kaydedilmiş anlık görüntü dosyaları üzerinde çalıştığı için fark işlemi veritabanı bağlantısı gerektirmez.
merql merge <base> <ours> <theirs>
Adlandırılmış üç anlık görüntü üzerinde üç yönlü birleştirme gerçekleştirin.
vendor/bin/merql merge base ours theirs
Çıktı:
Merge: base + ours + theirs
Operations: 12
Conflicts: 0
Clean: yes
Üç anlık görüntünün tamamı önceden alınmış olmalıdır. Kaydedilmiş anlık görüntü dosyaları üzerinde çalıştığı ve hiçbir zaman veritabanına yazmadığı için birleştirme işlemi veritabanı bağlantısı gerektirmez: CLI uygulama komutuna sahip değildir. Birleştirme sonucunu uygulamak için PHP API kullanın.
CLI sütun düzeyinde birleştirme yapar. TEXT veya JSON sütunlarında hücre düzeyinde birleştirme yapmaz; bu nedenle aynı sütundaki iki farklı düzenleme her zaman burada çakışmaya yol açar (#7). Hücre düzeyinde birleştirme için ThreeWayMerge öğesini PHP içindeki bir CellMergeConfig ile kullanın.
--dry-run
Birleştirmenin oluşturacağı SQL ifadelerini hiçbirini çalıştırmadan önizlemek için --dry-run bayrağını ekleyin. İfadeler, temel durumu birleştirilmiş sonuca dönüştürmeyi açıklar; bu nedenle her iki tarafın değişikliklerini de içerir.
vendor/bin/merql merge base ours theirs --dry-run
Çıktı:
Merge: base + ours + theirs
Operations: 3
Conflicts: 0
Clean: yes
Dry run SQL:
INSERT INTO `posts` (`id`, `title`, `status`) VALUES ('10', 'New Post', 'draft');
UPDATE `posts` SET `title` = 'Updated Title' WHERE `id` = '5';
DELETE FROM `comments` WHERE `id` = '3';
Geliştirme komutları
merql deposunun yerel kopyasında, oracle odaklı test paketi için bin/ altında daha fazla betik bulunur. Bunlar Composer paketinin parçası değildir; dolayısıyla bağımlılık kurulumunda yalnızca vendor/bin/merql bulunur. composer install işleminden sonra bunları deponun kök dizininden çalıştırın.
| Komut | Açıklama |
|---|---|
./bin/oracle <name> |
Bir senaryo için beklenen birleştirme sonucunu hesapla |
./bin/actual <name> |
merql'i bir senaryoda çalıştır ve çıktıyı yakala |
./bin/compare <name> |
Oracle çıktısıyla gerçek çıktıyı karşılaştır |
./bin/test-scenario <name> |
Tam işlem hattı: kurulum, oracle, gerçek çıktı, karşılaştırma |
./bin/test-regression |
Tüm senaryoları çalıştır |
./bin/test-regression --category clean |
Bir kategoriyi çalıştır: clean, conflict, identity, types, scale veya edge |
./bin/test-regression --fast |
Yalnızca başarılı/başarısız bilgisi, rapor yok |
./bin/verify-compliance |
Tam uyumluluk raporu |
./bin/verify-all |
PHPStan + kod stili + PHPUnit + oracle regresyonu |
bin/test-regression ayrıca --jobs seçeneğini kabul eder, ancak şu anda değeri yok sayar ve senaryoları art arda çalıştırır (#5). Bilinmeyen bir --category, No scenarios found çıktısı verir ve başarıyla çıkar.
Senaryo düzeni için Test Stratejisi bölümüne bakın.
Çıkış durumu
merql snapshot, diff ve merge, bir bağımsız değişken eksik olduğunda 1 durum koduyla çıkar; snapshot ayrıca bağlantı yapılandırılmamışsa da böyle çıkar. Eksik bir anlık görüntü, yakalanmamış bir SnapshotException hatasıyla komutu sonlandırır ve sıfır olmayan bir durum kodu döndürür. Bilinmeyen bir komut Unknown command çıktısı verir ancak şu anda 0 durum koduyla çıkar (#3).
Anlık görüntü depolama
Anlık görüntüler çalışma dizinine göre .merql/snapshots/ konumunda saklanır. Her anlık görüntü, <name>.json adlı tek bir JSON dosyasından oluşur. Komutların birbirlerinin anlık görüntülerini bulabilmesi için tümünü aynı dizinden çalıştırın.
CLI başka bir konum belirtmek için seçenek veya ortam değişkeni sunmaz (#8). Farklı bir konum kullanmak için çalıştırmadan önce başka bir çalışma dizinine geçin. PHP içinde, anlık görüntüleri almadan veya yüklemeden önce dizini ayarlayın:
use Merql\Snapshot\SnapshotStore;
SnapshotStore::setDirectory('/var/data/merql-snapshots');
Anlık görüntü dosyaları taşınabilir. Bunları makineler arasında kopyalayabilir, sürüm denetimine ekleyebilir veya ortak hata ayıklama için paylaşabilirsiniz. CLI tarafından alınan bir anlık görüntü, her ikisi de aynı dizini kullandığı sürece PHP içinde SnapshotStore::load() ile yüklenebilir; tersi de geçerlidir.