2016-04-08 25 views
31

Ben "şu anda OTP geçiyor ve iksir-lang web sitesinde öğretici karıştırmak tarafından İksiri öğreniyorum ve ben yeniden derlemek ve kabuk içinden projeyi yeniden nasıl bulmakta sorun yaşıyorum. Erlang I'deBir Elixir projesini nasıl yeniden derlerim ve iex'in içinden nasıl yüklerim?

make:all([load]) yapacağını ve ben içinden herhangi eşdeğer bulamıyorum İksir bunun ihtiyaçlarını derleme oluyor için karışımını kullanır, mantıklı gelmez.

hep :up_to_date diyor iex Ancak. oluştu herhangi bir değişiklik, bir yük derlemek istiyorum

+0

'iex'de' r/1' denediniz mi? 'H()' diyerek 'iex’de yardım çağırabileceğinizi unutmayın. Bunlardan bazıları size yardımcı olabilirse etrafta görün. – Guedes

+0

'r/1' hakkında bilgi sahibi değildim ama bu hala eşdeğer değil. Her modülü el ile girmeliyim. Kod güncellemesini güncelledim: make: all ([load]) 'güncellenmiş modülleri otomatik olarak algılayacak ve yeniden derleyip/yeniden yükleyecektir. – KallDrexx

+0

Belki de http://stackoverflow.com/questions/32540703/make-elixir-app-recompile-and-reload-on-source-code-change ve https://groups.google.com ile ilgili bir şey arıyorsanız./forum/#! konu/iksir-lang-konuşma/uU8K2NJAE70? Görünüşe göre bu bir tane ile kopyalanmış. – Guedes

cevap

54

IEx.Helpers.recompile/0 İşlevini kullanabilirsiniz

Geçerli Mix uygulamasını yeniden derler.

Bu yardımcı yalnızca IEx bir Karma projesiyle başlatıldığında, örneği için, iex -S mix örneğinde çalışır. Kodu derlemeden önce geçerli uygulamasını durduracak ve daha sonra tekrar başlatacaktır. uygulamalarının durdurulması gereklidir; bu nedenle denetim ağacındaki işlemler, doğru hot-code takas mekanizması geçmeden kod çok kez yükseltildiğinde çökmez.

mix.exs10 veya yapılandırma dosyalarındaki değişiklikler bu yardımcısı tarafından alınmaz, yalnızca kaynaklarda değişiklik yapılmaz. Kabuğun yeniden başlatılması ve Mix, bu gibi durumlarda gerekli olduğunu.

Tek bir modülü yeniden yüklemek isterseniz, bunun yerine r ModuleName kullanmayı düşünün.

Not: Bu özellik deneyseldir ve yaklaşan sürümlerinde kaldırılabilir.

https://github.com/elixir-lang/elixir/blob/v1.2.4/lib/iex/lib/iex/helpers.ex#L56-L93

+2

Would 'c (" filename.ex ")' Aynı şekilde çalışın @Dogbert? Sadece merak. –

+0

@OnorioCatenacci no, yalnızca bir dosyayı yeniden derler. – develop7

+0

IEx.Helpers.recompile/0, çalışan işlemleri kilitleyecektir. Ayrıca, başarısız modüllerin yüklenmemesi ile derleme hatalarını da yok sayar. Bu, canlı kodlama için kullanılamaz hale getirir. –

6

tek dezavantajı itibaren @ için buldum Dogbert cevabı o uygulamanın tamamen durmuş, ve yeniden yapmasıdır. Bu teoride tamam olsa da benim projemde Ranch'e bağlı olduğu için şu andaki projemde başarısız oldu, ama her şey düzgün bir şekilde durmadı. Bunun anlamı, soketin zaten kullanımda olduğu için başarısız olduğu projeyi yeniden başlatmaya çalıştığında işler kırıldı.

Uzun lafın kısası, ben Yardımcısı'nın koduna baktı ve benim modüle aşağıdaki işlevi eklendi:

def recompile() do 
    Mix.Task.reenable("app.start") 
    Mix.Task.reenable("compile") 
    Mix.Task.reenable("compile.all") 
    compilers = Mix.compilers 
    Enum.each compilers, &Mix.Task.reenable("compile.#{&1}") 
    Mix.Task.run("compile.all") 
    end 

Şimdi MyApp.recompile girebilir ve her şey sıcak yeniden uygulamanın yeniden yoktur.

+0

Bu, artık sürüm 1.5'te çalışmıyor. Ben [: noop,: noop] 'aldım –

15
26 Şubat

2017:

yanlış kullanımını gidiş şey en düşük şansı ile çalışan iksir sisteminde sıcak yük bileşenleri için:

case c(filename_ex, :in_memory) do 
    [] -> :ignore 
    [mod|_] -> r(mod) 
end 

Orjinal cevap: iksiri 1.3 olarak

. 0 derleme artık uygulamayı yeniden başlatmaz.

iex> recompile() 

NOT: Ben büyük olasılıkla kazasında süreçleri yeniden derleme eğer oluştuğu olurken recompile sırasında modülleri kaldırarak ilgili sorunlardan kaynaklanabilir eklemek istediğiniz herhangi bir kaynak değişti ve hotload Yani eğer doğru yolu kontrol etmek Bir state_timeout ile bir gen_statem gibi uçuş mesajlarında var.

NOT2: Kaynak bir dosyada hata yaparsanız, derleme/0'ı kullanarak proje, bu kaynak dosya eksik ve yüksüz olarak derler.