İçeriğe geç

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ıç

Kabuk
# 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:

Kabuk
# 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
Kabuk
# 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
Kabuk
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.

Kabuk
vendor/bin/merql snapshot baseline

Çıktı:

Kod
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.

Kabuk
vendor/bin/merql diff baseline current

Çıktı:

Kod
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.

Kabuk
vendor/bin/merql merge base ours theirs

Çıktı:

Kod
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.

Kabuk
vendor/bin/merql merge base ours theirs --dry-run

Çıktı:

Kod
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:

PHP
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.