Kabuk Betiğinin Kullanıcı Yapılandırması. En iyi uygulamalar?


13

Kullanıcı tarafından yapılandırılması gereken birkaç değişkenli bir kabuk komut dosyası yazıyorum. Muhtemelen bir dizi soru sorarak betiği indirmek ve yapılandırmak için bir yükleyici olacaktır. Söz konusu senaryo diğer geliştiricilere yöneliktir.

Bu, çeşitli şekillerde uygulanabilir:

  1. Betiğin içindeki yer tutucuları kullanın ve sedyükleme sırasında değiştirmek için kullanın (şuna benzer: /programming/415677/how-to-replace-placeholders-in-a-text-file )

    • Artıları: Tüm değişken tanımları kod içinde yer alır. Komut dosyasını manuel olarak indirmek ve yükleyiciye bir düzenleyici tercih eden kullanıcılar için değişkenleri yapılandırmak kolaydır.

    • Eksileri: Değişkenleri yüklendikten sonra yükleyici aracılığıyla yeniden yapılandırmak zordur. Hatalara yatkın olacak daha karmaşık bir normal ifade oluşturmadıkça.

  2. Bir yapılandırma dosyası , temel olarak atamalara sahip başka bir kabuk komut dosyası kullanın sourceve eklemek için kullanın . (Ve muhtemelen içine yerleştirin ~/.scriptname? Ana komut dosyası kopyalanır /usr/local/bin)

    • Artıları: Betiği yeniden yapılandırmak kolaydır. Ana komut dosyasından bunu yapmak için bir parametre bile ekleyebilir (Muhtemelen ilk çözümde de işe yarar, ancak bir komut dosyasını kendisinden düzenlemek çok iyi bir fikir gibi gelmiyor)

    • Eksileri: Komut dosyası artık iki dosyaya bağımlıdır ve kullanıcının yapılandırma dosyasının oluşturulması için yükleyiciyi çalıştırması gerekir. Bu, otomatik olarak bir yapılandırma dosyası oluşturularak çözülebilir. Ancak, harici bir yapılandırma dosyasını bulmak, komut dosyasını indirmek, düzenlemek ve onunla yapmak isteyen kullanıcılar için daha hantal olacaktır.

Ayrıca, kurulumdan sonra yapılandırmanın kullanıcı tarafından nasıl yönetilmesi gerektiğine ilişkin birkaç seçenek:


  1. $ Myscript yapılandırma sunucusu gibi git.host example.org $ myscript yapılandırma sunucusu.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / web

  2. Etkileşimli
    $ myscript config
    Sunucu ana bilgisayar adını
    girin : example.org Sunucudaki proxy'nin yolunu girin: / home / johndoe / proxy
    Sunucudaki http dizininin yolunu girin: / home / johndoe / web

  3. uzun seçenekli getopts
    $ myscript --host example.org --proxypath / home / johndoe / proxy --httppath / home / johndoe / web

  4. Basit
    $ myscript config example.org / home / johndoe / proxy / home / johndoe / web

Bunu yapmanın başka yolları var mı?
En iyi uygulamalar, zarif bir şey var mı?


2
Ben şüphe bunu yapabilirsiniz tüm bu yapar bir kabuk yazılımı, ama soru neden bunu bir kabuk içinde bir yükleyici gerektirir gibi karmaşık böylece şeyler yazmak istiyorum. Her neyse, Linux çekirdek yapılandırma sisteminin yapılandırma dosyasını nasıl yönettiğine bakın.

İyi. 'Installer' komut dosyası yalnızca gerçek komut dosyasını indirir, doğru konumuna kopyalar ve yapılandırma için bir dizi soru sorar (3-4 değişken). Bu şekilde, kullanıcılara tek bir komut satırı verebilirim, kurulum komut dosyasını wgetting ve / bin / sh. Çünkü yükleyiciyi atlayabilir ve sadece ana betiğe bir 'install' parametresi ekleyebilirim. Belki daha iyi bir çözüm, ne düşünüyorsun?
Charlie Rudenstål

"ama soru neden bu kadar karmaşık bir şey yazmak istediğinizdir", İşte söz konusu komut dosyası: github.com/charlie-rudenstal/depo Yeni kullanıcıların gerçekleştirmesi gereken adım sayısını azaltmaya çalışıyorum Kurulum. Gerekli sunucu kurulumunu da otomatik hale getirmeye çalışmak.
Charlie Rudenstål

Yanıtlar:


6

Aklı başında bir programdan ne beklerdim (bir kabuk komut dosyası ya da değil):

  • Ben şimdiye kadar hiç adil yapılandırmak için çalıştırılabilir değiştirmek zorundayız. Bu bir işletim sistemi çekirdeği değil.
  • Komut satırını kullanarak herhangi bir ayarı iletebilirim. Bu, makul bir temerrüdü olmayan her bilgi parçası için bir zorunluluktur. Tek istisna etkileşimli giriş gerektiren bir şifredir.
  • İsteğe bağlı olarak, ortam değişkenini kullanarak bir ayarı iletebilirim.
  • Ayarları bir yapılandırma dosyasına yazabilirim ve bu dosya iyi bilinen bir ad altında varsa veya açıkça yukarıdaki iki yöntemi kullanarak işaretlenirse kullanılır.
  • Yapılandırma dosyası, komut satırı ile aynı ayar adlarını ve sözdizimini kullanır.

Harika tavsiye. Bu tercih ettiğiniz sipariş olur mu? (1) Komut satırında iletilen ayarları kontrol edin (2) Aynı dizindeki bir .scriptnameConfig ayarını kontrol edin (3) Bir ortam değişkenindeki ayarı kontrol edin (4) ~ / .scriptnameConfig dosyasında .scriptnameConfig ayarını kontrol edin (5) Varsayılanı kullan ayarı
Charlie Rudenstål

"Yapılandırma dosyası, komut satırı ile aynı ayar adlarını ve sözdizimini kullanır." - Bunun nasıl görünmesi gerekiyor? Normal kabuk komut dosyaları için atama sözdizimini kullanacaktım: SETTING = VALUE. Sözdizimi gibi komut bir yapılandırma dosyasının içinde biraz garip hissetmez mi?
Charlie Rudenstål

Komut satırında ve yapılandırmada aynı sözdizimini nasıl kullanacağınıza mountveya sshizin vermenize bakın . Komut satırı sözdizimini tamamen kopyalamanız gerekmez; '--foo = bar' yerine 'foo = bar' kullanabilirsiniz. Bunun yerine 'BarOption: Foo' kullandıysanız, çok daha az uygun olurdu: davanın önemli olup olmadığını, dosyada hangi anahtar kelimenin kabul edildiğini ve komut satırında hangi anahtar kelimenin kabul edilemediğini ve çalışan bir komutu kopyalayıp yapıştıramamayı hatırlama ihtiyacı sadece kozmetik düzenleme ile bir yapılandırma dosyasına.
9000

3

Çeşitli konfigürasyon seçenekleri ile ayrıntılı bir senaryo yazmaya gerek zaman ile Python kullanmak argparse ve ConfigParser kütüphaneler. Bunlar uygulamaya yardımcı olur, ancak işlem herhangi bir kabuk komut dosyası için geçerlidir:

  1. Bir yapılandırma dosyası arayın. Varsa, ayarlarını bir sözlük / arama tablosuna okuyun.
  2. Adlandırılmış komut satırı bağımsız değişkenlerini ayrıştırın. Sağlanan her bağımsız değişken için varsa yapılandırma dosyasından yüklenen değeri geçersiz kılın. Komut satırında geçmeyen ve yapılandırmada geçmeyen argümanlar için bir varsayılan kullanın.
  3. Komut dosyasının ana işlevini yürütme
  4. Yapılandırma dosyası yoksa, iletilen ve / veya varsayılan değerleri bu dosyaya yazın.

Komut dosyası tekrar tekrar kullanılacaksa, bir yapılandırma dosyasının tercih edilen seçenekleri tutması benim tercihimdir, ancak komut satırı bağımsız değişkenlerinin geçersiz kılınmasına izin verin. İlk çalıştırıldığında config dosyasını bu parametreleri kullanarak yazın. Yapılandırma dosyası daha sonra paylaşılabilir ve bir kod havuzuna atanabilir.

En son durumumda, varsayılanları [DEFAULT]yapılandırma dosyasının üst kısmındaki bölüme yazdım , sonra her "ortam" için her biri için uygun geçersiz kılmalara sahip bir bölümüm vardı. "Ortam", komut dosyasına adsız ilk parametredir. Bu durumda parametreler yerleşik varsayılan olarak seçilir -> yapılandırma dosyası varsayılanı -> yapılandırma dosyası bölüm değeri -> komut satırı parametresi . Ek bir komut satırı parametresi, var olan yapılandırmanın en son çalıştırma değeri ile üzerine yazma seçeneği sunar. Bu yapılandırma dosyası geçerli dizine yazılır, böylece proje başına uygulanır ve kodun geri kalanıyla işlenebilir. Aynı projeyi kontrol eden herkes aynı yapılandırmayla başlayacaktır.


"Ek bir komut satırı parametresi, var olan yapılandırmanın en son çalıştırma değeri ile üzerine yazma seçeneği sunar." Bu ilginç bir yaklaşım. Parametreleri yapılandırma ile birleştirmenin kullanışlı bir yolu.
Charlie Rudenstål

+1, ayrıca default.configkomut dosyasıyla aynı dizinde bulunan bir dosyada varsayılanların ayarlanmasını ve ardından ~/.scriptnamebu değerleri geçersiz kılmak için bir yapılandırma dosyası aramanızı öneririm . Bu şekilde her değer geçerli bir varsayılan değere sahiptir ve bakımı daha kolaydır.
Aaron

2

Yer tutucuları düzenlemek hataya açıktır.

Bir Config dosyası kullanarak giderdim.

Bağımlılıkla ilgili endişeniz geçerlidir, ancak tek bir dosyadan oluşan çok fazla araç kullandığımı hatırlamıyorum. Yani teorik olarak haklısın, ama pratikte oldukça iyi olmalı.

Bir üçüncü seçenek yapılandırma yazılımı yapmaktır yazma seçilen seçenekleri ve parametrelere özgü yeni uyarlanmış versiyonunu. Bunu yazmak ve test etmek daha zor olabilir :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.