2012-10-19 23 views
9

Projenizdeki SNAPSHOT bağımlılıklarına güvenirken, hermetik yapıların elde edilebileceği bir yol yaratmaya çalışıyorum. Örnek olması amacıyla Hermetik Maven Oluşturma

, böyle bir bağımlılık yapıya sahip bir proje olduğunu varsayalım: lokal olarak ilişkilidir şey yapmak istiyorum ne

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT 

tüm ANLıK bağımlılıkları çözmek olduğunu benim Geçerli sürümü ve daha sonra bunları Nexus'un yayın deposuna yayınlar olarak dağıtın. Bu bağımlılıkların hepsi içsel değildir, bu yüzden her biri üzerinde bir tahliye edemem. Bu örnekte other-1.2-mine-1.2.3 ve thing-3.1-SNAPSHOTthing-3.1-mine-1.2.3 olacaktır. Bu yaklaşık 60 sıra pitonda nispeten önemsizdir. Ancak sorun, geçişli SNAPSHOT'ları somut versiyonlara çözmektir. Bu yüzden gizmo-6.1.3-SNAPSHOT'u gizmo-6.1.3-mine.1.2.3'a dönüştürmem gerekiyor ve thing-3.1-mine-1.2.3 buna bağlı.

Bu, yalnızca istediğimi gerçekleştirmenin tek yolunun bir örneğidir. Amaç, bir ya da iki yıl boyunca, sürüm 1.2.3 için sürüm şubemde ödeme yapabilir ve uzun zamandır devam eden SNAPSHOT bağımlılıklarını çözme konusunda endişelenmenize gerek kalmadan mvn clean package ya da benzerlerini çalıştırabilmem.

Bu şubenin, derleme bağlayıcısının jar-and-dependencies işlevselliği gibi bir şey kullanarak tüm bağımlılıkları korumakla kalmayıp, aynı zamanda önemli olması önemlidir. Potansiyel olarak kaynak dosyaları değiştirebilir ve başka bir sürüm oluşturmayı (örneğin, bir düzeltme uygulayarak) yapmak isterim.

Yani,

  • somut olarak bir özyinelemeli şekilde ANLıK bağımlılıkları dönüştürmek mümkün olacak bu mevcut gibi bir şey var mı?
  • Bu tür şeyleri sizin için yöneten eklentiler var mı? Sürüm eklentisi, branch hedefinde bazı yapılandırma seçenekleri vaat ediyordu, ancak istediğim dereceye kadar harici depsleri çözemiyor.
  • Hermetik Maven oluşturmak için başka teknikler mevcut mu?
+3

Bana bir anti Maven hack gibi geliyor. Maven'de temel temel kurallardan biri ** Sözleşme Aşamasında Yapılandırma **. Bağımlılıklar kendiniz oluşturuyorsa, SNAPSHOT/RELEASE sürümünü kendiniz düzgün bir şekilde yönetmeniz/kullanmanız gerekir. Başka bir yerden geliyorlarsa, her zaman en son sürüm sürümünü kullanmalısınız (SNAPSHOT sürümü değil). [Maven The Complete Reference - bölüm 3.3.1] 'a ikinci bir göz atın (http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships -sect-sürümleri) ve SNAPSHOT'un Maven'de neden kullanıldığını görün. – yorkw

+0

Maven'in temellerini çok iyi anlıyorum. Ancak, gerçek dünyada, son derece kullanışlı ve SNAPSHOT versiyonlarına uzun süre dayanan son teslim tarihleri ​​ve üçüncü parti kütüphaneleri ile yaşıyorum. Jason Van Zyl, bildiğiniz birileri bile, yayınlar etrafında süreç-ağır bir sisteme sahip olma fikrini kabul ediyor bile, büyük bir hataydı (ve tesla ile değişiyor). Tüketmekte olduğumuz tüm projelerin iç çatallarını korumanın en kısa yolu, yaptığım şey aslında daha fazla sıçramalar ve sınırlar. –

+1

Dünyada bile iyi bir sebep dikkate alınmalıdır. Buradaki sistemle savaşıyorsun. Anlattığınız gibi Anlık Görüntüler yeterince uzun süre yaşamaz - zaman damgalı anlık görüntüler kullanarak artifact çözünürlüğüne güveniyorsanız bile. Benim yaklaşımım, bağımlılıkları kullanmak ve eklentileri kullanarak tüm eserleri almak ve bilinen enstantane bağımlılıklarını bir betik veya kendi kendine yapılan maven eklentisi kullanarak kendi maven repo'larına yerleştirmek olurdu. Belki diğer gizemlerle konuşmak da yardımcı olur: eğer eserlerinin beta versiyonlarını serbest bırakabilirlerse, etrafta çok fazla dalgalanma olmayanlara güvenebilirsiniz. – wemu

cevap

2

Bu yaygın olarak kullanılan bir teknik değildir, ancak bu blog yayınında açıklandığı gibi, her zaman bir "proje" deposu olarak projenize özel ANLıK bağımlılıkları kontrol edebilirsiniz: Kısacası Maven is to Ant as a Nail Gun is to a Hammer

Bağımlılıklar Eklentisini kullanmak, proje dizininizde deposu oluşturmak için. Aşağıdaki (okumak olmalıdır) bağlantılı blog yayınında kopyalanır:

1) mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

çalıştır "Bu yaratır/hedef/bağımlılıkları tüm projeler bağımlılıkları bir Repo-benzeri düzeni"

<repositories> 
    <repository> 
    <releases /> 
    <id>snapshots-I-need-forever</id> 
    <name>snapshots-I-need-forever</name> 
    <url>file:///${basedir}/libs</url> 
    </repository> 
</repositories> 
012:

2) POM için aşağıdaki gibi bir depo bildirimi ekle libs/

3) gibi bir şey için target/dependencies/ Kopya .. doğru yere indirilen bağımlılıkları taşımak için AntRun Plugin kullanarak

Umut bu yaşam döngüsü phasephase için bağımlılıklar eklenti yapılandırarak adım 1 ve 2. adım:

Bu Yapınızın/bırakma işleminin otomatik bir parçası haline senin için çalışıyor. Şimdi bir duş almalıyım ...

+0

Bunu tam olarak yapmadım, ama gelecekteki gezginler muhtemelen bu çözümü isteyecekler. Özel bir nexus deposu oluşturdum ve buna özel sürümler yerleştirdim ve daha sonra asıl gönderide anlattığım gibi bir betik aracılığıyla pompayı güncelleştirdim. Bununla birlikte, bu tekniği son işimde kullandım ve benzer bir kullanım durumu için mükemmel bir şekilde çalıştı. –

2

Maven sürümleri eklentisi, istediğinizin çoğunu yapacak.

http://mojo.codehaus.org/versions-maven-plugin/

neredeyse certianly tüm bağımlılıklarını gidermek ve buna göre pom dosyasını güncelleştirmek hangi bir ön inşa adımda bunu çalıştırmanız gerekir Ancak. Ardından, gerçek yapıyı çalıştırmak için maveni (pompayı yeniden okur) tekrar çalıştırın. Pompanın içindeki her şeyi ayrı bir hedefle tetikleyebilir ve böylece ayrı bir senaryodan kaçınabilirsiniz.

Bu, SNAPSHOT bağımlılıkları yerine belirli sürümleri kullanırsanız ve ön oluşturma adımının gerekirse bunları yükseltmesine izin verirseniz daha iyi çalışır. Bağımlılık çözümlemesindeki tek gerçek fark, maven'in her zaman yeniden -SNAPSHOT bağımlılıklarını yeniden yüklemesidir, ancak yeni bir sürüm mevcutsa sadece normal bağımlılıkları indirir. Ancak, birçok eklenti (sürüm eklentisi dahil), -SNAPSHOT bağımlılıklarını farklı şekilde sorunlara neden olur.Her CI derlemesinin yeni bir sürüm numarası içermediğinden, hiçbir zaman -SNAPSHOT kullanmam, geliştirici yerel gibi şeyler için daha öngörülebilir davranışlarla -DEV gibi farklı bir etiket kullanmayı tercih ediyor.

Maven'i almak için çok zaman harcadım buna benzer şeyler. Bildiğim çoğu maven projesinde, sürüm numaralarını ayarlamak ya da bunun gibi diğer sınırlamaları aşmak için bir çeşit ön hazırlık adımı var. Tüm bunları tek adımda yapmaya çalışmak genellikle başarısız olur, çünkü maven sadece bir kez pompayı okur, dizgi değiştirme birkaç yerde çalışmaz ve konuşlandırılan/kurulan pom, genellikle dizinin yerine koyma ya da yapılan değişikliklerin sonuçlarını içermez. inşa sırasında.