سؤال

لقد تم بناء تطبيق GWT 1.7 + GAE باستخدام البرنامج المساعد Eclipse. يتم تحميل ثوابت النظام في ملف MyConstants.Properties الذي تم تحميله بواسطة فئة MyConstants Singleton التي تمتد ... GWT.I18N.Client.constants.

أود أن يقوم Myçontants بتحميل أحد العديد من الملفات التي تحتوي على إعدادات مثل

  • MyConstants-local.properties.
  • MyConstants-alpha.properties.
  • MyConstants-beta.properties.
  • MyConstants-prod.properties.

لقد وجدت عدة إشارات إلى مرحلة العادة الخيطية، لكن هذا لا يبدو أن هذا يدعمه الجن. بالإضافة إلى ذلك، فإنه يتعامل فقط في التعامل مع DEV / PROD وأحتاج بالتأكيد إلى حل محلي / بيتا / برز.

هل هناك طريقة للقيام بذلك باستخدام Arg Sticard Arg أو بعض مثيل آخر المعلمة قيد التشغيل التي ستعمل عند تحميلها على GAE؟

هل كانت مفيدة؟

المحلول

على جانب خادم GAE، كنت قادرا على التمييز بين بيئة Dev الخاصة بي من أي بيئة إنتاج منتشرة بهذه البتات من التعليمات البرمجية.

إنشاء واجهة واحدة وملفتين فئة.

public interface MyConstants {
 public String myConstant(); 
}

public class MyConstantsDev implements MyConstants {
 public String myConstant() { return "xyzzy-dev"; };
}

public class MyConstantsProd implements MyConstants {
 public String myConstant() { return "xyzzy-prod"; };
}

تحديد القليل من الخيار السحرية ملزمة باستخدام "user.dir" env var. دليل آخر ضمن مسار المستخدم. هل هو معرف تطبيق محركات تطبيق Google الفريد أو دليل تطوير مشروع الجذر الخاص بك. بمجرد معرفة ذلك، يمكنك تحديد مجموعة الثوابت لاستخدامها.

public class MyServerModule extends com.google.inject.AbstractModule {

 String appIdentifier = new File( System.getProperty("user.dir") ).getName();
 if ( appIdentifier.equals("trunk") ) {
  // Load MyConstants-dev.properties
  bind( MyConstants.class ).to( MyConstantsDev.class ).in(Singleton.class);
 } else {
  // Load MyConstants-prod.properties
  bind( MyConstants.class ).to( MyConstantsProd.class ).in(Singleton.class);
 }
}

هذا يسمح لي بحقن ثوابت DEV / PROD في فصول مثل هذا:

public class MyDomainClass {

 @Inject
 public MyDomainClass( Logger logger, MyConstants const ) { 
  logger.debug( const.myConstant() ); 
 };
}

نصائح أخرى

يجب عليك استخدام الواجهة الآمنة ذات النوع الاجتماعي بشكل خاص للعمل ...

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production)
{
  //It's production.
}
else
{
  //It's Dev - and (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development)
}

شيء واحد مختلف بين التطوير والبيئة المنتشرة هو SERVER_SOFTWARE متغيرات البيئة:

if (System.getenv("SERVER_SOFTWARE").startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}

ربما يمكنك اختيار الوحدة النمطية التي يمكن تحميلها بناء على ذلك.

على الإجابة أعلاه للحصول على gae Server_Software. عامل؛ يتوفر متغير بيئة Server_Software افتراضيا CGI وبالتالي إعداد خادم الويب الخاص به ولا يمكن الوصول إليه من خلال Vars Environment System Vars ولكنه متاح من ServelletContext.

إليك الرمز الذي يجب أن يحصل لك على القيمة التي تحتاجها (بدون فكرة لماذا ServerInfo وليس ServersoftWare ...):

if (getServletContext().getServerInfo().startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top