Bu belgede , Remote Config şablonu olarak bilinen JSON biçimli parametreler ve koşullar kümesini programlı olarak nasıl okuyabileceğiniz ve değiştirebileceğiniz açıklanmaktadır. Bu, istemci uygulamasının istemci kitaplığını kullanarak getirebileceği arka uçta şablon değişiklikleri yapmanıza olanak tanır.
Remote Config REST API'sini veya bu kılavuzda açıklanan Yönetici SDK'larını kullanarak, Remote Config değişikliklerini kendi süreçlerinize doğrudan entegre etmek için Firebase konsolundaki şablonu yönetmeyi atlayabilirsiniz. Örneğin, Remote Config arka uç API'leri ile şunları yapabilirsiniz:
- Remote Config güncellemelerinin planlanması . API çağrılarını bir cron işiyle birlikte kullanarak, Remote Config değerlerini düzenli bir zamanlamaya göre değiştirebilirsiniz.
- Kendi tescilli sisteminizden Firebase Remote Config'e verimli bir şekilde geçiş yapmak için yapılandırma değerlerini toplu olarak içe aktarın .
Sunucu tarafında gerçekleşen olaylara göre uygulamanızdaki değerleri değiştirerek Firebase için Cloud Functions ile Remote Config kullanın . Örneğin, uygulamanızda yeni bir özelliği tanıtmak için Remote Config'i kullanabilir ve ardından, yeterli sayıda kişinin yeni özellikle etkileşim kurduğunu tespit ettiğinizde bu tanıtımı otomatik olarak kapatabilirsiniz.
Bu kılavuzun aşağıdaki bölümlerinde, Remote Config arka uç API'leri ile yapabileceğiniz işlemler açıklanmaktadır. REST API aracılığıyla bu görevleri gerçekleştiren bazı kodları incelemek için şu örnek uygulamalardan birine bakın:
- Firebase Remote Config REST API Java Hızlı Başlangıç
- Firebase Remote Config REST API Node.js Hızlı Başlangıç
- Firebase Remote Config REST API Python Hızlı Başlangıç
Firebase Admin SDK'yı kullanarak Remote Config'i değiştirin
Admin SDK, Firebase ile ayrıcalıklı ortamlardan etkileşim kurmanıza izin veren bir dizi sunucu kitaplığıdır. Admin SDK, Remote Config güncellemelerini gerçekleştirmenin yanı sıra, Firebase kimlik doğrulama belirteçlerinin oluşturulmasını ve doğrulanmasını, Realtime Database'den okuma ve yazmayı vb. sağlar. Admin SDK ön koşulları ve kurulumu hakkında daha fazla bilgi edinmek için Firebase Admin SDK'yı sunucunuza ekleme bölümüne bakın.
Tipik bir Remote Config akışında, geçerli şablonu alabilir, bazı parametreleri veya parametre gruplarını ve koşullarını değiştirebilir, şablonu doğrulayabilir ve ardından yayınlayabilirsiniz. Bu API çağrılarını yapmadan önce, SDK'dan gelen istekleri yetkilendirmelisiniz.
SDK'yı başlatın ve API isteklerini yetkilendirin
Yönetici SDK'sını parametresiz olarak başlattığınızda SDK, Google Uygulaması Varsayılan Kimlik Bilgilerini kullanır ve seçenekleri FIREBASE_CONFIG
ortam değişkeninden okur. FIREBASE_CONFIG
değişkeninin içeriği bir {
ile başlıyorsa, bir JSON nesnesi olarak ayrıştırılacaktır. Aksi takdirde SDK, dizenin seçenekleri içeren bir JSON dosyasının adı olduğunu varsayar.
Örneğin:
Node.js
const admin = require('firebase-admin'); admin.initializeApp();
java
FileInputStream serviceAccount = new FileInputStream("service-account.json"); FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options);
Geçerli Remote Config Şablonunu edinin
Remote Config şablonlarıyla çalışırken, bunların sürümlü olduğunu ve her sürümün oluşturulduğu andan onu bir güncellemeyle değiştirdiğiniz zamana kadar sınırlı bir kullanım ömrüne sahip olduğunu unutmayın: 90 gün, toplam 300 depolanan sürüm sınırı. Daha fazla bilgi için bkz. Şablonlar ve Sürüm Oluşturma .
Remote Config şablonunun geçerli etkin sürümünü JSON biçiminde almak için arka uç API'lerini kullanabilirsiniz.
Bir A/B Testi denemesinde değişkenler olarak özel olarak oluşturulan parametreler ve parametre değerleri, dışa aktarılan şablonlara dahil edilmez.
Şablonu almak için:
Node.js
function getTemplate() { var config = admin.remoteConfig(); config.getTemplate() .then(function (template) { console.log('ETag from server: ' + template.etag); var templateStr = JSON.stringify(template); fs.writeFileSync('config.json', templateStr); }) .catch(function (err) { console.error('Unable to get template'); console.error(err); }); }
java
Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get(); // See the ETag of the fetched template. System.out.println("ETag from server: " + template.getETag());
Remote Config parametrelerini değiştirin
Remote Config parametrelerini ve parametre gruplarını programlı olarak değiştirebilir ve ekleyebilirsiniz. Örneğin, "yeni_menü" adlı mevcut bir parametre grubuna mevsimsel bilgilerin görüntülenmesini kontrol etmek için bir parametre ekleyebilirsiniz:
Node.js
function addParameterToGroup(template) { template.parameterGroups['new_menu'].parameters['spring_season'] = { defaultValue: { useInAppDefault: true }, description: 'spring season menu visibility.', }; }
java
template.getParameterGroups().get("new_menu").getParameters() .put("spring_season", new Parameter() .setDefaultValue(ParameterValue.inAppDefault()) .setDescription("spring season menu visibility.") );
API, yeni parametreler ve parametre grupları oluşturmanıza veya varsayılan değerleri, koşullu değerleri ve açıklamaları değiştirmenize olanak tanır. Her durumda, değişiklikleri yaptıktan sonra şablonu açıkça yayınlamanız gerekir.
Remote Config koşullarını değiştirin
Remote Config koşullarını ve koşullu değerleri program aracılığıyla değiştirebilir ve ekleyebilirsiniz. Örneğin, yeni bir koşul eklemek için:
Node.js
function addNewCondition(template) { template.conditions.push({ name: 'android_en', expression: 'device.os == \'android\' && device.country in [\'us\', \'uk\']', tagColor: 'BLUE', }); }
java
template.getConditions().add(new Condition("android_en", "device.os == 'android' && device.country in ['us', 'uk']", TagColor.BLUE));
Her durumda, değişiklikleri yaptıktan sonra şablonu açıkça yayınlamanız gerekir.
Remote Config arka uç API'leri, uygulamanızın davranışını ve görünümünü değiştirmek için kullanabileceğiniz çeşitli koşullar ve karşılaştırma işleçleri sağlar. Koşullar ve bu koşullar için desteklenen işleçler hakkında daha fazla bilgi edinmek için koşullu ifade referansına bakın.
Remote Config şablonunu doğrulayın
İsteğe bağlı olarak, güncellemelerinizi yayınlamadan önce aşağıda gösterildiği gibi doğrulayabilirsiniz:
Node.js
function validateTemplate(template) { admin.remoteConfig().validateTemplate(template) .then(function (validatedTemplate) { // The template is valid and safe to use. console.log('Template was valid and safe to use'); }) .catch(function (err) { console.error('Template is invalid and cannot be published'); console.error(err); }); }
java
try { Template validatedTemplate = FirebaseRemoteConfig.getInstance() .validateTemplateAsync(template).get(); System.out.println("Template was valid and safe to use"); } catch (ExecutionException e) { if (e.getCause() instanceof FirebaseRemoteConfigException) { FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause(); System.out.println("Template is invalid and cannot be published"); System.out.println(rcError.getMessage()); } }
Bu doğrulama işlemi, parametreler ve koşullar için yinelenen anahtarlar, geçersiz koşul adları veya var olmayan koşullar veya yanlış biçimlendirilmiş etiketler gibi hataları kontrol eder. Örneğin, izin verilen sayıdan (2000) daha fazla anahtar içeren bir istek, Param count too large
hata mesajını döndürür.
Remote Config şablonunu yayınlayın
Bir şablonu alıp istediğiniz güncellemelerle revize ettikten sonra onu yayınlayabilirsiniz. Bu bölümde açıklandığı gibi bir şablon yayınlamak, mevcut yapılandırma şablonunun tamamını güncellenmiş dosyayla değiştirir ve yeni etkin şablona, değiştirdiği şablondan bir numaralı sürüm numarası atanır.
Gerekirse, önceki sürüme geri dönmek için REST API'yi kullanabilirsiniz. Bir güncellemedeki hata riskini azaltmak için yayınlamadan önce doğrulayabilirsiniz.
Remote Config kişiselleştirmeleri ve koşulları indirilen şablonlara dahildir, bu nedenle farklı bir projede yayınlamaya çalışırken aşağıdaki sınırlamaların farkında olmak önemlidir:
Kişiselleştirmeler projeden projeye aktarılamaz.
Örneğin, projenizde kişiselleştirmeleri etkinleştirdiyseniz ve bir şablonu indirip düzenlerseniz, aynı projede yayınlayabilirsiniz ancak kişiselleştirmeleri şablondan silmediğiniz sürece farklı bir projede yayınlayamazsınız.
Koşullar projeden projeye aktarılabilir, ancak belirli koşullu değerlerin (uygulama kimlikleri veya kitleler gibi) yayınlamadan önce hedef projede bulunması gerektiğini unutmayın.
Örneğin,
iOS
platform değerini belirten bir koşulu kullanan bir Remote Config parametreniz varsa, platform değerleri herhangi bir proje için aynı olduğundan, şablon başka bir projede yayınlanabilir. Ancak, hedef projede bulunmayan belirli bir uygulama kimliğine veya kullanıcı kitlesine dayanan bir koşul içeriyorsa doğrulama başarısız olur.Yayınlamayı planladığınız şablon, Google Analytics'e dayanan koşullar içeriyorsa, hedef projede Analytics'in etkinleştirilmesi gerekir.
Node.js
function publishTemplate() { var config = admin.remoteConfig(); var template = config.createTemplateFromJSON( fs.readFileSync('config.json', 'UTF8')); config.publishTemplate(template) .then(function (updatedTemplate) { console.log('Template has been published'); console.log('ETag from server: ' + updatedTemplate.etag); }) .catch(function (err) { console.error('Unable to publish template.'); console.error(err); }); }
java
try { Template publishedTemplate = FirebaseRemoteConfig.getInstance() .publishTemplateAsync(template).get(); System.out.println("Template has been published"); // See the ETag of the published template. System.out.println("ETag from server: " + publishedTemplate.getETag()); } catch (ExecutionException e) { if (e.getCause() instanceof FirebaseRemoteConfigException) { FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause(); System.out.println("Unable to publish template."); System.out.println(rcError.getMessage()); } }
REST API kullanarak Remote Config'i değiştirin
Bu bölümde, https://firebaseremoteconfig.googleapis.com
adresinde Remote Config REST API'nin ana özellikleri açıklanmaktadır. Tüm ayrıntılar için API referansına bakın.
API isteklerini doğrulamak ve yetkilendirmek için bir erişim belirteci alın
Firebase projeleri, uygulama sunucunuzdan veya güvenilir ortamınızdan Firebase sunucu API'lerini çağırmak için kullanabileceğiniz Google hizmet hesaplarını destekler. Yerel olarak kod geliştiriyorsanız veya uygulamanızı şirket içinde dağıtıyorsanız, sunucu isteklerini yetkilendirmek için bu hizmet hesabı aracılığıyla alınan kimlik bilgilerini kullanabilirsiniz.
Bir hizmet hesabının kimliğini doğrulamak ve Firebase hizmetlerine erişim yetkisi vermek için JSON biçiminde bir özel anahtar dosyası oluşturmanız gerekir.
Hizmet hesabınız için bir özel anahtar dosyası oluşturmak üzere:
Firebase konsolunda Ayarlar > Hizmet Hesapları öğesini açın.
Yeni Özel Anahtar Oluştur'a tıklayın, ardından Anahtar Oluştur'a tıklayarak onaylayın.
Anahtarı içeren JSON dosyasını güvenli bir şekilde saklayın.
Bir hizmet hesabı aracılığıyla yetkilendirme yaparken, başvurunuza kimlik bilgilerini sağlamak için iki seçeneğiniz vardır. GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini ayarlayabilir veya kodda hizmet hesabı anahtarının yolunu açıkça iletebilirsiniz. İlk seçenek daha güvenlidir ve şiddetle tavsiye edilir.
Ortam değişkenini ayarlamak için:
GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini, hizmet hesabı anahtarınızı içeren JSON dosyasının dosya yoluna ayarlayın. Bu değişken yalnızca mevcut kabuk oturumunuz için geçerlidir, bu nedenle yeni bir oturum açarsanız değişkeni yeniden ayarlayın.
Linux veya macOS
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
pencereler
PowerShell ile:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
Yukarıdaki adımları tamamladıktan sonra, Uygulama Varsayılan Kimlik Bilgileri (ADC), Google dışı ortamlarda test ederken veya çalıştırırken hizmet hesabı kimlik bilgilerini kullanmanıza izin vererek, kimlik bilgilerinizi dolaylı olarak belirleyebilir.
Kısa ömürlü bir OAuth 2.0 erişim belirtecini almak için Firebase kimlik bilgilerinizi tercih ettiğiniz dil için Google Auth Library ile birlikte kullanın:
düğüm.js
function getAccessToken() {
return admin.credential.applicationDefault().getAccessToken()
.then(accessToken => {
return accessToken.access_token;
})
.catch(err => {
console.error('Unable to get access token');
console.error(err);
});
}
Bu örnekte, Google API istemci kitaplığı, isteği bir JSON web belirteci veya JWT ile doğrular. Daha fazla bilgi için bkz. JSON web belirteçleri .
Piton
def _get_access_token():
"""Retrieve a valid access token that can be used to authorize requests.
:return: Access token.
"""
credentials = ServiceAccountCredentials.from_json_keyfile_name(
'service-account.json', SCOPES)
access_token_info = credentials.get_access_token()
return access_token_info.access_token
java
private static String getAccessToken() throws IOException {
GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(new FileInputStream("service-account.json"))
.createScoped(Arrays.asList(SCOPES));
googleCredentials.refreshAccessToken();
return googleCredentials.getAccessToken().getTokenValue();
}
Erişim belirtecinizin süresi dolduktan sonra, güncellenmiş bir erişim belirtecini almak için belirteç yenileme yöntemi otomatik olarak çağrılır.
Remote Config'e erişim yetkisi vermek için https://www.googleapis.com/auth/firebase.remoteconfig
kapsamını isteyin.
Remote Config şablonunu değiştirin
Remote Config şablonlarıyla çalışırken, bunların sürümlü olduğunu ve her sürümün oluşturulduğu andan onu bir güncellemeyle değiştirdiğiniz zamana kadar sınırlı bir kullanım ömrüne sahip olduğunu unutmayın: 90 gün, toplam 300 depolanan sürüm sınırı. Daha fazla bilgi için bkz. Şablonlar ve Sürüm Oluşturma .
Geçerli Remote Config Şablonunu edinin
Remote Config şablonunun geçerli etkin sürümünü JSON biçiminde almak için arka uç API'lerini kullanabilirsiniz.
Bir A/B Testi denemesinde değişkenler olarak özel olarak oluşturulan parametreler ve parametre değerleri, dışa aktarılan şablonlara dahil edilmez.
Aşağıdaki komutları kullanın:
kıvırmak
curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -o filename
Bu komut, JSON yükünü bir dosyaya ve başlıkları (Etag dahil) ayrı bir dosyaya verir.
Ham HTTP isteği
Host: firebaseremoteconfig.googleapis.com GET /v1/projects/my-project-id/remoteConfig HTTP/1.1 Authorization: Bearer token Accept-Encoding: gzip
Bu API çağrısı, sonraki istek için kullandığınız bir ETag'i içeren ayrı bir başlıkla birlikte aşağıdaki JSON'u döndürür.
Remote Config şablonunu doğrulayın
İsteğe bağlı olarak, güncellemelerinizi yayınlamadan önce doğrulayabilirsiniz. Yayınlama isteğinize ?validate_only=true
URL parametresini ekleyerek şablon güncellemelerini doğrulayın. Yanıtta, bir durum kodu 200 ve -0
sonekine sahip güncellenmiş bir et etiketi, güncellemenizin başarıyla doğrulandığı anlamına gelir. 200 olmayan herhangi bir yanıt, JSON verilerinin yayınlamadan önce düzeltmeniz gereken hatalar içerdiğini gösterir.
Remote Config şablonunu güncelleyin
Bir şablonu alıp JSON içeriğini istediğiniz güncellemelerle revize ettikten sonra, onu yayınlayabilirsiniz. Bu bölümde açıklandığı gibi bir şablon yayınlamak, mevcut yapılandırma şablonunun tamamını güncellenmiş dosyayla değiştirir ve yeni etkin şablona, değiştirdiği şablondan bir numaralı sürüm numarası atanır.
Gerekirse, önceki sürüme geri dönmek için REST API'yi kullanabilirsiniz. Bir güncellemedeki hata riskini azaltmak için yayınlamadan önce doğrulayabilirsiniz.
Remote Config kişiselleştirmeleri ve koşulları indirilen şablonlara dahildir, bu nedenle farklı bir projede yayınlamaya çalışırken aşağıdaki sınırlamaların farkında olmak önemlidir:
Kişiselleştirmeler projeden projeye aktarılamaz.
Örneğin, projenizde kişiselleştirmeleri etkinleştirdiyseniz ve bir şablonu indirip düzenlerseniz, aynı projede yayınlayabilirsiniz ancak kişiselleştirmeleri şablondan silmediğiniz sürece farklı bir projede yayınlayamazsınız.
Koşullar projeden projeye aktarılabilir, ancak belirli koşullu değerlerin (uygulama kimlikleri veya kitleler gibi) yayınlamadan önce hedef projede bulunması gerektiğini unutmayın.
Örneğin,
iOS
platform değerini belirten bir koşulu kullanan bir Remote Config parametreniz varsa, platform değerleri herhangi bir proje için aynı olduğundan, şablon başka bir projede yayınlanabilir. Ancak, hedef projede bulunmayan belirli bir uygulama kimliğine veya kullanıcı kitlesine dayanan bir koşul içeriyorsa doğrulama başarısız olur.Yayınlamayı planladığınız şablon, Google Analytics'e dayanan koşullar içeriyorsa, hedef projede Analytics'in etkinleştirilmesi gerekir.
kıvırmak
curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -d @filename
Bu curl
komutu için, "@" karakterini ve ardından dosya adını kullanarak içeriği belirtebilirsiniz.
Ham HTTP isteği
Host: firebaseremoteconfig.googleapis.com PUT /v1/projects/my-project-id/remoteConfig HTTP/1.1 Content-Length: size Content-Type: application/json; UTF8 Authorization: Bearer token If-Match: expected ETag Accept-Encoding: gzip JSON_HERE
Bu bir yazma talebi olduğundan, ETag bu komut tarafından değiştirilir ve bir sonraki PUT
komutunun yanıt başlıklarında güncellenmiş bir ETag sağlanır.
Remote Config koşullarını değiştirin
Remote Config koşullarını ve koşullu değerleri program aracılığıyla değiştirebilirsiniz. REST API ile, şablonu yayınlamadan önce koşulları değiştirmek için şablonu doğrudan düzenlemeniz gerekir.
{ "conditions": [{ "name": "android_english", "expression": "device.os == 'android' && device.country in ['us', 'uk']", "tagColor": "BLUE" }, { "name": "tenPercent", "expression": "percent <= 10", "tagColor": "BROWN" }], "parameters": { "welcome_message": { "defaultValue": { "value": "Welcome to this sample app" }, "conditionalValues": { "tenPercent": { "value": "Welcome to this new sample app" } }, "description": "The sample app's welcome message" }, "welcome_message_caps": { "defaultValue": { "value": "false" }, "conditionalValues": { "android_english": { "value": "true" } }, "description": "Whether the welcome message should be displayed in all capital letters." } } }
Yukarıdaki değişiklikler önce bir dizi koşulu tanımlar ve ardından her parametre için varsayılan değerleri ve koşula dayalı parametre ( koşullu değerler ) değerlerini tanımlar. Ayrıca her öğe için isteğe bağlı bir açıklama ekler; kod yorumları gibi bunlar da geliştirici kullanımı içindir ve uygulamada görüntülenmez. Sürüm kontrolü amacıyla bir ETag de sağlanır.
Remote Config arka uç API'leri, uygulamanızın davranışını ve görünümünü değiştirmek için kullanabileceğiniz çeşitli koşullar ve karşılaştırma işleçleri sağlar. Koşullar ve bu koşullar için desteklenen işleçler hakkında daha fazla bilgi edinmek için koşullu ifade referansına bakın.
HTTP Hata kodları
Durum kodu | Anlam |
---|---|
200 | Başarıyla güncellendi |
400 | Bir doğrulama hatası oluştu. Örneğin, izin verilen anahtar sayısından (2000) fazlasını içeren bir istek, Param count too large hata mesajıyla birlikte 400 (Kötü İstek) döndürür. Ayrıca, bu HTTPS Durum Kodu şu iki durumda ortaya çıkabilir:
|
401 | Bir yetkilendirme hatası oluştu (erişim belirteci sağlanmadı veya Firebase Remote Config REST API, Cloud Developer Console'da projenize eklenmedi) |
403 | Bir kimlik doğrulama hatası oluştu (yanlış erişim belirteci sağlandı) |
500 | Dahili bir hata oluştu. Bu hata oluşursa bir Firebase destek bileti gönderin |
200 durum kodu, Remote Config şablonunun (proje için parametreler, değerler ve koşullar) güncellendiği ve artık bu projeyi kullanan uygulamalar tarafından kullanılabilir olduğu anlamına gelir. Diğer durum kodları, önceden var olan Remote Config şablonunun hâlâ yürürlükte olduğunu gösterir.
Şablonunuza güncellemeler gönderdikten sonra, değişikliklerinizin beklendiği gibi göründüğünü doğrulamak için Firebase konsoluna gidin. Bu kritiktir, çünkü koşulların sıralaması nasıl değerlendirildiklerini etkiler ( true
değerlendiren ilk koşul devreye girer).
ETag kullanımı ve zorunlu güncellemeler
Remote Config REST API, yarış koşullarını ve kaynaklarda çakışan güncellemeleri önlemek için bir varlık etiketi (ETag) kullanır. ETag'ler hakkında daha fazla bilgi edinmek için ETag - HTTP'ye bakın.
REST API için Google, en son GET
komutu tarafından sağlanan ETag'i önbelleğe almanızı ve PUT
komutları verirken bu ETag değerini If-Match
istek başlığında kullanmanızı önerir. PUT
komutunuz bir HTTPS Durum Kodu 409 ile sonuçlanırsa, bir sonraki PUT
komutunuzla kullanmak üzere yeni bir ETag ve şablon almak için yeni bir GET
komutu vermelisiniz.
Remote Config şablonunu aşağıdaki şekilde güncellenmeye zorlayarak ETag'i ve sağladığı korumayı atlatabilirsiniz: If-Match: *
Ancak bu yaklaşım, Remote Config'inizdeki güncellemelerin kaybolmasına neden olma riski taşıdığından önerilmez. birden fazla istemci Remote Config şablonunu güncelliyorsa şablon. Bu tür bir çakışma, API'yi kullanan birden çok istemcide veya API istemcilerinden ve Firebase konsol kullanıcılarından gelen çakışan güncellemelerde meydana gelebilir.
Remote Config şablon sürümlerini yönetme konusunda rehberlik için bkz. Remote Config şablonları ve sürüm oluşturma .