Bir geliştirici ve tüm kodumuzu içeren bir svn repo ile başladık:
^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1
(o zaman bu büyük bir gelişmeydi). Bu, biraz büyümek için bir şans elde ettikten sonra, dairesel bağımlılıklar, yavaş testisler ve kodu yeniden kullanmanın genel zorlukları ile ilgili sorunlar yaşamaya başladık (çünkü web sitesi1'in özellik seti başka bir şekilde genel modül-a'ya girdi).
Kod tabanını modülerleştirmek ve kısa bir süre içinde git'e gitmemizi beklemek (ve git'in svn mega-repos'u sevmediği bir yerde okumak), çok daha ayrıntılı bir yapıya geçtik:
^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)
Bu kavramsal olarak harikaydı. Daha modüler kod, çok daha hızlı test paketleri, belgelenmesi daha kolay, vb. Daha genel bileşenlerimizin bazılarını açık kaynaklı hale getirdik ve tüm modülleri pip olarak takılabilir hale getirdik ( pip install -e .
bunları development
virtualenv'e kurmak için kullanarak ).
Çalışma ^/srv/trunk
zamanı ortamının klasör yapısını içeren bir havuz oluşturduk , yani. ^/srv/trunk/lib
modüller, /srv/trunk/src
kalıntılar ^/foo/trunk
, ^/srv/trunk/www
web siteleri vb.
Ve son olarak (çok uzun zaman önce çalıştığım performanstan bir fikir alarak [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ) bir "vcs- ilgili tüm depoları listeleyen ve bunların geliştirici ortamına nereden kontrol edilmesi gerektiğini gösteren metin dosyasını ve buna karşılık gelen bir komutu getir. Örneğin, bir vcs-fetc satırı:
svn srv/lib/module-a ^/module-a/trunk
neden olur (ilk kez)
cd /srv/lib && svn co ^/module-a/trunk module-a
veya (daha sonra)
cd /srv/lib/module-a && svn up
ve benzer şekilde github depoları için (hem kendi hem de değiştirilmiş / değiştirilmemiş satıcı paketlerimiz).
Üretim ortamını oluşturmak için aynı vcs-fetch işlemini kullandık, ancak bir vcs-fetch yaptıktan sonra hangi sürümün prod'da çalıştırıldığını bilmemizin bir yolu olmadığını çabucak öğreniyoruz.
Mega repo ile, sadece bagajdan eşyayı güncellemeden önce revizyon numarasını not edebiliriz ve geri dönmek basit bir svn -r nnn up .
uzaktı. Hem svn hem de git kodunda (ve hg'de bir modül) ve ~ 120 depolarında, bunun nasıl yapılacağı açık değildir.
Bugün http://12factor.net/ okudum ve ilk faktör "Bir kod temeli" olduğunu, bu yüzden de burada doğru yoldan uzakta olup olmadığını merak ediyorum?
Benim bir fikrim pip-kurulabilir "dağıtım" tekerlekler oluşturacak bir dağıtım komut dosyası oluşturmak ve bunları bir requirements.txt
dosyada "paket" oldu . Bir dağıtım daha sonra yeni bir virtualenv oluşturmayı, dağıtım tekerleklerini listeleyen gereksinimler.txt dosyasını oluşturmayı ve etkin virtualenv'i değiştirmeyi içerir. Bir öncekine geri dönmek sadece virtualenv'i geri çevirmeyi içerecekti (ancak biz sanalenleri sonsuza dek tutmak istemezsek, zaman içinde herhangi bir noktaya geri dönmemize izin vermezdi - daha önce hiç ihtiyaç duyulmamış deneyimlerime göre).
Bu noktada yanlış yönde yürüyüp yürümediğimi ya da doğru yolda yeterince yürümediğimi merak ediyorum ..? (okuduğum her şey "uygulamanız" hakkında konuşmaya devam ediyor ve bunun aynı kod tabanından 14 web sitesi çalıştırmaya nasıl dönüştüğünü bilmiyorum ...)