Saya telah memperhatikan yang berikut:
Mesin Penuh
Dengan mesin penuh, aplikasi induk mewarisi rute dari mesin. Tidak perlu menentukan apa pun di parent_app/config/routes.rb
. Menentukan gem di Gemfile sudah cukup bagi aplikasi induk untuk mewarisi model, rute, dll. Rute mesin ditetapkan sebagai:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Tidak ada namespacing model, pengontrol, dll. Ini segera dapat diakses oleh aplikasi induk.
Mesin yang Dapat Dipasang
Namespace mesin diisolasi secara default:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
Dengan mesin yang dapat dipasang, rute diberi ruang nama dan aplikasi induk dapat memaketkan fungsionalitas ini dalam satu rute:
# my_engine/config/routes.rb
MyEngine::Engine.routes.draw do
#whatever
end
# parent_app/config/routes.rb
ParentApp::Application.routes.draw do
mount MyEngine::Engine => "/engine", :as => "namespaced"
end
Model, pengontrol, dll diisolasi dari aplikasi induk - meskipun pembantu dapat dibagikan dengan mudah.
Inilah perbedaan utama yang saya lihat. Mungkin ada yang lain? Saya telah bertanya di sini , tetapi belum menerima tanggapan.
Kesan saya adalah karena mesin penuh tidak mengisolasi dirinya dari aplikasi induk, paling baik digunakan sebagai aplikasi mandiri yang berdekatan dengan aplikasi induk. Saya yakin bentrokan nama bisa terjadi.
Mesin yang dapat dipasang dapat digunakan dalam situasi di mana Anda ingin menghindari konflik nama dan menggabungkan mesin di bawah satu rute tertentu di aplikasi induk. Misalnya, saya sedang membangun mesin pertama saya yang dirancang untuk layanan pelanggan. Aplikasi induk dapat menggabungkan fungsionalitasnya dalam satu rute seperti:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Jika asumsi saya salah, seseorang harap beri tahu saya dan saya akan memperbaiki tanggapan ini. Saya telah membuat artikel kecil tentang subjek di sini Cheers!
mount MyEngine::Engine => "/"
. Ini berfungsi untuk sumber daya, mungkin itu juga kasus untuk mesin.Kedua opsi tersebut akan menghasilkan mesin . Perbedaannya adalah itu
--mountable
akan membuat mesin dalam ruang nama yang terisolasi, sedangkan--full
akan membuat mesin yang berbagi ruang nama dari aplikasi utama.Perbedaan tersebut akan diwujudkan dalam 3 cara:
1) File kelas mesin akan memanggil
isolate_namespace
:lib / my_full_engine / engine.rb:
lib / my_mountable_engine / engine.rb:
2) File mesin
config/routes.rb
akan memiliki namespace:Mesin penuh:
Mesin terpasang:
3) Struktur file untuk pengontrol, pembantu, tampilan, dan aset akan diberi spasi nama:
Penjelasan
Kasus penggunaan untuk
--full
opsi tersebut tampaknya sangat terbatas. Secara pribadi saya tidak dapat memikirkan alasan bagus mengapa Anda ingin memisahkan kode Anda ke dalam mesin tanpa mengisolasi namespace juga- Ini pada dasarnya hanya akan memberi Anda dua aplikasi yang digabungkan erat yang berbagi struktur file yang identik dan semua konflik dan kebocoran kode itu memerlukan.Setiap bagian dari dokumentasi yang pernah saya lihat menunjukkan
--mountable
opsinya, dan memang panduan tepi saat ini sangat mendorong Anda untuk memasukkannyaisolate namespace
- yang sama dengan mengatakan penggunaan--mountable
berulang--full
.Akhirnya ada kebingungan terminologi: Sayangnya
rails plugin -h
menunjukkan deskripsi berikut:Ini memberi kesan yang Anda gunakan
--full
untuk membuat "mesin" dan--mountable
untuk membuat sesuatu yang lain yang disebut "aplikasi yang dapat dipasang", padahal sebenarnya keduanya adalah mesin - satu namespace dan satu tidak. Itu pasti akan menimbulkan kebingungan karena pengguna yang ingin membuat mesin kemungkinan akan berasumsi bahwa itu--full
adalah opsi yang lebih relevan.Kesimpulan
rails plugin new something --full
= Mesin di ruang nama aplikasi Anda. (Mengapa kamu akan?)rails plugin new something --mountable
= Mesin dengan namespace itu sendiri. (Luar Biasa)Referensi
sumber
--full
: jika Anda memiliki bagian dari situs web rel, Anda ingin tetap terintegrasi (bukan di ruang nama yang terisolasi) dan masih berbagi di antara proyek rel yang berbeda. Juga bisa lebih sederhana dari itu: mungkin permata Anda tidak menambahkan sebanyak itu, tetapi Anda ingin bisa mengaitkannya dengan benar.Admin::AdminService.some_action
tetapi tidak harus mengubah rute Anda jika aplikasi sisi klien lain seperti aplikasi Ember menggunakan rute yang terkait dengan kode Anda ingin mengisolasi. --full sepertinya merupakan langkah perantara yang mungkin lebih mudah diterapkan.saya bertanya-tanya hal yang sama dan, karenanya, berakhir di sini. menurut saya jawaban sebelumnya pada dasarnya mencakup pertanyaan, tetapi saya pikir yang berikut mungkin juga membantu:
yang menarik (bagi saya) adalah kenyataan bahwa tidak ada perbedaan antara
dan
sumber
--full
lebih diutamakan--mountable
?Pemahaman saya tentang perbedaannya adalah bahwa mesin itu seperti plugin, dan menambahkan fungsionalitas ke aplikasi yang ada. Sementara aplikasi yang dapat dipasang pada dasarnya adalah sebuah aplikasi, dan dapat berdiri sendiri.
Jadi, jika Anda ingin menjalankannya sendiri atau dalam aplikasi lain, Anda akan membuat aplikasi yang dapat dipasang. Jika Anda bermaksud menjadikannya sebagai tambahan untuk aplikasi yang sudah ada, tetapi tidak berjalan dengan sendirinya, Anda akan menjadikannya sebagai mesin.
sumber
Perbedaannya, saya yakin, adalah bahwa aplikasi yang dapat dipasang diisolasi dari aplikasi host, sehingga mereka tidak dapat berbagi kelas - model, pembantu, dll. Ini karena aplikasi yang dapat dipasang adalah titik akhir Rack (yaitu aplikasi Rack dengan sendirinya ).
Penafian: Saya, seperti kebanyakan, baru saja mulai bermain-main dengan Rails 3.1.
sumber