۱. مرور کلی
این مجموعه از آزمایشگاههای کد (آموزشهای عملی و خودآموز) با هدف کمک به توسعهدهندگان برای درک گزینههای مختلفی که هنگام استقرار برنامههای خود دارند، ارائه شده است. در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه از API ترجمه ابری گوگل با پایتون استفاده کنید و آن را به صورت محلی اجرا کنید یا در یک پلتفرم محاسباتی بدون سرور ابری (App Engine، Cloud Functions یا Cloud Run) مستقر کنید. برنامه نمونه موجود در مخزن این آموزش را میتوان (حداقل) به هشت روش مختلف با تنها تغییرات جزئی در پیکربندی مستقر کرد:
- سرور محلی Flask (پایتون ۲)
- سرور محلی Flask (پایتون ۳)
- موتور برنامه (پایتون ۲)
- موتور برنامه (پایتون ۳)
- توابع ابری (پایتون ۳)
- اجرای ابری (پایتون ۲ از طریق داکر)
- اجرای ابری (پایتون ۳ از طریق داکر)
- اجرای ابری (پایتون ۳ از طریق Cloud Buildpacks)
این آزمایشگاه کد بر روی استقرار این برنامه در پلتفرم(های) بولد شده بالا تمرکز دارد.
یاد خواهید گرفت که چگونه
- از APIهای گوگل کلود، به ویژه API ترجمه کلود (پیشرفته/نسخه ۳) استفاده کنید.
- یک برنامه وب پایه را به صورت محلی اجرا کنید یا آن را روی یک پلتفرم محاسباتی ابری بدون محدودیت زمانی مستقر کنید.
آنچه نیاز دارید
- یک پروژه Google Cloud با یک حساب Cloud Billing فعال
- فلاسک برای اجرای محلی نصب شده باشد، یا یک پلتفرم محاسباتی ابری بدون محدودیت برای استقرارهای مبتنی بر ابر فعال باشد
- مهارتهای پایه پایتون
- آشنایی با دستورات اولیه سیستم عامل
نظرسنجی
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با پایتون چگونه ارزیابی میکنید؟
تجربه خود را در استفاده از خدمات ابری گوگل چگونه ارزیابی میکنید؟
۲. تنظیمات و الزامات
تنظیم محیط خودتنظیم
- وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .



- نام پروژه ، نام نمایشی برای شرکتکنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمیشود و شما میتوانید آن را در هر زمانی بهروزرسانی کنید.
- شناسه پروژه باید در تمام پروژههای گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید میکند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاههای کد، باید به شناسه پروژه ارجاع دهید (و معمولاً با نام
PROJECT_IDشناخته میشود)، بنابراین اگر آن را دوست ندارید، یک شناسه تصادفی دیگر ایجاد کنید، یا میتوانید شناسه خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. سپس پس از ایجاد پروژه، آن "منجمد" میشود. - یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده میکنند. برای اطلاعات بیشتر در مورد هر سه این مقادیر به مستندات مراجعه کنید.
- در مرحله بعد، برای استفاده از منابع/APIهای ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینهای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، دستورالعملهای «پاکسازی» موجود در انتهای آزمایشگاه کد را دنبال کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.
۳. فعال کردن API ترجمه
فعالسازی APIهای ابری
در این بخش، نحوه فعال کردن APIهای گوگل را به طور کلی یاد خواهید گرفت. برای برنامه نمونه ما، API ترجمه ابری (Cloud Translation API) ، Cloud Run و Cloud Artifact Registry را فعال خواهید کرد.
مقدمه
صرف نظر از اینکه میخواهید از کدام API گوگل در برنامه خود استفاده کنید، باید آنها را فعال کنید . مثال زیر دو روش برای فعال کردن API Cloud Vision را نشان میدهد. پس از یادگیری نحوه فعال کردن یک API Cloud، میتوانید API های دیگر را نیز فعال کنید زیرا روند کار مشابه است.
گزینه ۱: از Cloud Shell یا رابط خط فرمان شما
اگرچه فعال کردن APIها از طریق کنسول ابری رایجتر است، برخی از توسعهدهندگان ترجیح میدهند همه کارها را از طریق خط فرمان انجام دهند. برای انجام این کار، باید «نام سرویس» یک API را جستجو کنید. این نام شبیه یک URL است: SERVICE_NAME .googleapis.com . میتوانید این موارد را در نمودار محصولات پشتیبانیشده پیدا کنید، یا میتوانید با استفاده از API کشف گوگل، به صورت برنامهنویسی شده آنها را جستجو کنید.
با استفاده از این اطلاعات، با استفاده از Cloud Shell (یا محیط توسعه محلی خود که ابزار خط فرمان gcloud روی آن نصب شده است )، میتوانید یک API را به صورت زیر فعال کنید:
gcloud services enable SERVICE_NAME.googleapis.com
برای مثال، این دستور، API مربوط به Cloud Vision را فعال میکند:
gcloud services enable vision.googleapis.com
این دستور App Engine را فعال میکند:
gcloud services enable appengine.googleapis.com
همچنین میتوانید چندین API را با یک درخواست فعال کنید. برای مثال، این خط فرمان Cloud Run، Cloud Artifact Registry و Cloud Translation API را فعال میکند:
gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com
گزینه ۲: از کنسول ابری
همچنین میتوانید Vision API را در API Manager فعال کنید. از Cloud Console، به API Manager بروید و Library را انتخاب کنید.

اگر میخواهید Cloud Vision API را فعال کنید، در نوار جستجو عبارت "vision" را وارد کنید، هر چیزی که با آنچه تاکنون وارد کردهاید مطابقت داشته باشد، ظاهر میشود:

API مورد نظر برای فعالسازی را انتخاب کنید و روی Enable کلیک کنید:

هزینه
اگرچه بسیاری از APIهای گوگل را میتوان بدون هزینه استفاده کرد، استفاده از محصولات و APIهای گوگل کلود رایگان نیست . هنگام فعال کردن APIهای ابری، ممکن است از شما یک حساب صورتحساب فعال درخواست شود. با این حال، توجه به این نکته مهم است که برخی از محصولات گوگل کلود دارای یک سطح «همیشه رایگان» (روزانه/ماهانه) هستند که برای اعمال هزینههای صورتحساب باید از آن سطح فراتر بروید. در غیر این صورت، از کارت اعتباری شما (یا ابزار صورتحساب مشخص شده) هزینهای کسر نخواهد شد.
کاربران باید قبل از فعال کردن هر API، به اطلاعات قیمت آن مراجعه کنند، به خصوص توجه داشته باشند که آیا سطح رایگانی دارد یا خیر، و اگر دارد، سطح آن چیست. اگر میخواهید API Cloud Vision را فعال کنید، صفحه اطلاعات قیمتگذاری آن را بررسی کنید. Cloud Vision سهمیه رایگان دارد و تا زمانی که در مجموع (در هر ماه) در محدوده آن بمانید، نباید هیچ هزینهای متحمل شوید.
قیمتگذاری و سطوح رایگان بین APIهای گوگل متفاوت است. مثالها:
- Google Cloud/GCP - هر محصول به طور متفاوتی صورتحساب میشود و عموماً به ازای هر چرخه vCPU، مصرفکننده فضای ذخیرهسازی، استفاده از حافظه یا پرداخت به ازای هر استفاده پرداخت میشود؛ به اطلاعات سطح رایگان در بالا مراجعه کنید.
- نقشههای گوگل - مجموعهای از APIها را ارائه میدهد و به کاربران اعتبار ماهانه رایگان ۲۰۰ دلاری ارائه میدهد.
- رابطهای برنامهنویسی کاربردی گوگل ورکاسپیس (که قبلاً جی سوئیت نام داشت) - استفاده رایگان (تا سقف مشخصی) را با پرداخت هزینه اشتراک ماهانه ورکاسپیس ارائه میدهد، بنابراین هیچ هزینه مستقیمی برای استفاده از رابطهای برنامهنویسی کاربردی جیمیل، گوگل درایو، تقویم، اسناد، برگهها و اسلایدها وجود ندارد.
محصولات مختلف گوگل قیمتهای متفاوتی دارند، بنابراین حتماً برای این اطلاعات به مستندات API خود مراجعه کنید.
خلاصه
حالا که میدانید چگونه APIهای گوگل را به طور کلی فعال کنید، به API Manager بروید و Cloud Translation API، Cloud Run و Cloud Artifact Registry را فعال کنید (اگر قبلاً این کار را نکردهاید). مورد اول را فعال میکنید زیرا برنامه ما از آن استفاده میکند. مورد دوم را فعال میکنید زیرا تصاویر کانتینر ما قبل از استقرار برای شروع سرویس Cloud Run شما در آنجا ذخیره میشوند، به همین دلیل است که باید آن را فعال کنید. اگر ترجیح میدهید همه آنها را با ابزار gcloud فعال کنید، دستور زیر را از ترمینال خود صادر کنید:
gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com
اگرچه سهمیه ماهانه آن در صفحه خلاصه کلی سطح «همیشه رایگان» ذکر نشده است، صفحه قیمتگذاری API ترجمه بیان میکند که همه کاربران ماهانه مقدار ثابتی از کاراکترهای ترجمه شده را دریافت میکنند. اگر کمتر از آن آستانه باقی بمانید، هیچ هزینهای از API متحمل نخواهید شد. اگر هزینههای مرتبط با Google Cloud دیگری وجود داشته باشد، در پایان در بخش «پاکسازی» مورد بحث قرار خواهد گرفت.
۴. کد نمونه برنامه را دریافت کنید
کد موجود در مخزن را به صورت محلی یا در Cloud Shell (با استفاده از دستور git clone ) کپی کنید، یا فایل ZIP را از دکمه سبز Code آن، همانطور که در تصویر زیر نشان داده شده است، دانلود کنید:

حالا که همه چیز را دارید، برای انجام این آموزش خاص، یک کپی کامل از پوشه ایجاد کنید، زیرا احتمالاً شامل حذف یا تغییر فایلها خواهد بود. اگر میخواهید پیادهسازی متفاوتی انجام دهید، میتوانید با کپی کردن فایل اصلی از ابتدا شروع کنید تا مجبور نباشید دوباره آن را کلون یا دانلود کنید.
۵. بررسی نمونه برنامه
برنامه نمونه، یک مشتق ساده از گوگل ترنسلیت است که از کاربران میخواهد متنی را به انگلیسی وارد کنند و ترجمه معادل آن متن را به اسپانیایی دریافت کنند. اکنون فایل main.py را باز کنید تا ببینیم چگونه کار میکند. با حذف خطوط کامنتگذاری شده در مورد مجوز، در بالا و پایین به این شکل خواهد بود:
from flask import Flask, render_template, request
import google.auth
from google.cloud import translate
app = Flask(__name__)
_, PROJECT_ID = google.auth.default()
TRANSLATE = translate.TranslationServiceClient()
PARENT = 'projects/{}'.format(PROJECT_ID)
SOURCE, TARGET = ('en', 'English'), ('es', 'Spanish')
# . . . [translate() function definition] . . .
if __name__ == '__main__':
import os
app.run(debug=True, threaded=True, host='0.0.0.0',
port=int(os.environ.get('PORT', 8080)))
- این ایمپورتها، قابلیتهای Flask، ماژول
google.authو کتابخانه کلاینت Cloud Translation API را به همراه دارند. - متغیرهای سراسری نشاندهندهی برنامهی Flask، شناسهی پروژهی Cloud، کلاینت API ترجمه، «مسیر مکان» والد برای فراخوانیهای API ترجمه و زبانهای مبدا و مقصد هستند. در این مورد، انگلیسی (
en) و اسپانیایی (es) هستند، اما میتوانید این مقادیر را به کدهای زبانهای دیگری که توسط Cloud Translation API پشتیبانی میشوند، تغییر دهید. - بلوک بزرگ
ifدر پایین، در آموزش اجرای محلی این برنامه استفاده میشود - این بلوک از سرور توسعه Flask برای ارائه برنامه ما استفاده میکند. این بخش همچنین برای آموزشهای استقرار Cloud Run در صورتی که وب سرور در کانتینر بستهبندی نشده باشد، در اینجا قرار دارد. از شما خواسته میشود که بستهبندی سرور در کانتینر را فعال کنید، اما در صورتی که این مورد را نادیده بگیرید، کد برنامه به استفاده از سرور توسعه Flask برمیگردد. (این مشکل با App Engine یا Cloud Functions نیست زیرا آنها پلتفرمهای مبتنی بر منبع هستند، به این معنی که Google Cloud یک وب سرور پیشفرض را ارائه و اجرا میکند.)
در نهایت، در میان main.py قلب برنامه، تابع translate() قرار دارد:
@app.route('/', methods=['GET', 'POST'])
def translate(gcf_request=None):
"""
main handler - show form and possibly previous translation
"""
# Flask Request object passed in for Cloud Functions
# (use gcf_request for GCF but flask.request otherwise)
local_request = gcf_request if gcf_request else request
# reset all variables (GET)
text = translated = None
# if there is data to process (POST)
if local_request.method == 'POST':
text = local_request.form['text']
data = {
'contents': [text],
'parent': PARENT,
'target_language_code': TARGET[0],
}
# handle older call for backwards-compatibility
try:
rsp = TRANSLATE.translate_text(request=data)
except TypeError:
rsp = TRANSLATE.translate_text(**data)
translated = rsp.translations[0].translated_text
# create context & render template
context = {
'orig': {'text': text, 'lc': SOURCE},
'trans': {'text': translated, 'lc': TARGET},
}
return render_template('index.html', **context)
تابع اصلی، کار دریافت ورودی کاربر و فراخوانی API ترجمه برای انجام کارهای سنگین را انجام میدهد. بیایید آن را به صورت جزئیتر بررسی کنیم:
- با استفاده از متغیر
local_requestبررسی کنید که آیا درخواستها از توابع ابری (Cloud Functions) میآیند یا خیر. توابع ابری (Cloud Functions ) شیء درخواست فلاسک (Flask Request ) خود را ارسال میکنند، در حالی که سایر توابع (که به صورت محلی اجرا میشوند یا در App Engine یا Cloud Run مستقر میشوند) شیء درخواست را مستقیماً از فلاسک دریافت میکنند. - متغیرهای اساسی فرم را مجدداً تنظیم کنید. این کار در درجه اول برای درخواستهای GET است زیرا درخواستهای POST دادههایی دارند که جایگزین این موارد میشوند.
- اگر از نوع POST است، متن را برای ترجمه دریافت کنید و یک ساختار JSON ایجاد کنید که نشاندهندهی الزامات فرادادهی API باشد. سپس API را فراخوانی کنید و اگر کاربر از کتابخانهی قدیمیتری استفاده میکند، به نسخهی قبلی API برگردید.
- صرف نظر از این، نتایج واقعی (POST) یا بدون داده (GET) را در قالب متن قالب قرار دهید و رندر کنید.
بخش بصری برنامه در فایل index.html قالب قرار دارد. این فایل، نتایج ترجمه شده قبلی (در غیر این صورت خالی) را نشان میدهد و به دنبال آن فرمی برای درخواست ترجمه چیزی نمایش داده میشود:
<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<h2>My Google Translate (1990s edition)</h2>
{% if trans['text'] %}
<h4>Previous translation</h4>
<li><b>Original</b>: {{ orig['text'] }} (<i>{{ orig['lc'][0] }}</i>)</li>
<li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}
<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>
۶. سرویس را مستقر کنید
اکنون با اجرای این دستور، آمادهاید تا سرویس ترجمه خود را در Cloud Run مستقر کنید:
gcloud run deploy translate --source . --allow-unauthenticated --platform managed
خروجی باید به شکل زیر باشد و شامل دستورالعملهایی برای مراحل بعدی باشد:
$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed Please specify a region: [1] asia-east1 [2] asia-east2 . . . (other regions) . . . [28] us-west4 [29] cancel Please enter your numeric choice: REGION_CHOICE To make this the default region, run `gcloud config set run/region REGION`. Deploying from source requires an Artifact Registry repository to store build artifacts. A repository named [cloud-run-source-deploy] in region [REGION] will be created. Do you want to continue (Y/n)? This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]" Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION] ✓ Building and deploying... Done. ✓ Creating Container Repository... ✓ Uploading sources... ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b 9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER]. ✓ Creating Revision... ✓ Routing traffic... ✓ Setting IAM Policy... Done. Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic. Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app
اکنون که برنامه شما به صورت جهانی در سراسر جهان در دسترس است، باید بتوانید از طریق URL حاوی شناسه پروژه خود، همانطور که در خروجی استقرار نشان داده شده است، به آن دسترسی پیدا کنید:

یه چیزی ترجمه کن تا ببینی چی میشه!

۷. نتیجهگیری
تبریک! شما یاد گرفتید که چگونه API ترجمه ابری را فعال کنید، اعتبارنامههای لازم را دریافت کنید و یک برنامه وب ساده را روی Python 2 Cloud Run مستقر کنید! میتوانید اطلاعات بیشتر در مورد این استقرار را از این جدول در مخزن .
تمیز کردن
API ترجمه ابری به شما امکان میدهد تعداد مشخصی از کاراکترهای ترجمه شده را در هر ماه به صورت رایگان انجام دهید. App Engine نیز سهمیه رایگان دارد و همین امر در مورد Cloud Functions و Cloud Run نیز صدق میکند. در صورت تجاوز از هر یک از این موارد، هزینههایی متحمل خواهید شد. اگر قصد دارید به codelab بعدی ادامه دهید، لازم نیست برنامه خود را خاموش کنید.
با این حال، اگر هنوز آماده رفتن به آموزش بعدی نیستید یا نگران هستید که اینترنت برنامهای را که تازه مستقر کردهاید، کشف کند، برنامه App Engine خود را غیرفعال کنید ، عملکرد Cloud خود را حذف کنید یا سرویس Cloud Run خود را غیرفعال کنید تا از پرداخت هزینهها جلوگیری کنید. وقتی آماده رفتن به آزمایشگاه کد بعدی شدید، میتوانید آن را دوباره فعال کنید. از طرف دیگر، اگر قصد ادامه کار با این برنامه یا آزمایشگاههای کد دیگر را ندارید و میخواهید همه چیز را به طور کامل حذف کنید، میتوانید پروژه خود را متوقف کنید .
همچنین، استقرار در یک پلتفرم محاسباتی بدون سرور Google Cloud هزینههای ساخت و ذخیرهسازی کمی را متحمل میشود. Cloud Build همانند Cloud Storage سهمیه رایگان خود را دارد. برای شفافیت بیشتر، Cloud Build تصویر برنامه شما را میسازد که سپس در Cloud Container Registry یا Artifact Registry ، جانشین آن، ذخیره میشود. ذخیرهسازی آن تصویر و همچنین خروجی شبکه هنگام انتقال آن تصویر به سرویس، مقداری از آن سهمیه را مصرف میکند. با این حال، ممکن است در منطقهای زندگی کنید که چنین ردیف رایگانی ندارد، بنابراین از میزان استفاده از فضای ذخیرهسازی خود آگاه باشید تا هزینههای احتمالی را به حداقل برسانید.
۸. منابع اضافی
در بخشهای بعدی، میتوانید مطالب خواندنی بیشتر و همچنین تمرینهای پیشنهادی برای افزایش دانش خود از تکمیل این آموزش را بیابید.
مطالعه اضافی
حالا که کمی با API ترجمه آشنا شدید، بیایید چند تمرین دیگر برای توسعه بیشتر مهارتهایتان انجام دهیم. برای ادامه مسیر یادگیری، برنامه نمونه ما را طوری تغییر دهید که موارد زیر را انجام دهد:
- تمام نسخههای دیگر این آزمایشگاه کد را برای اجرای محلی یا استقرار در پلتفرمهای محاسباتی بدون سرور Google Cloud تکمیل کنید (به مخزن README مراجعه کنید).
- این آموزش را با استفاده از یک زبان برنامهنویسی دیگر تکمیل کنید.
- این برنامه را طوری تغییر دهید که از زبانهای مبدأ یا مقصد مختلف پشتیبانی کند.
- این برنامه را ارتقا دهید تا بتواند متن را به بیش از یک زبان ترجمه کند؛ فایل الگو را تغییر دهید تا فهرستی از زبانهای مقصد پشتیبانیشده داشته باشید.
بیشتر بدانید
موتور برنامه گوگل
- صفحه اصلی موتور برنامه
- مستندات موتور برنامه
- شروع سریع موتور برنامه پایتون ۳
- حسابهای سرویس پیشفرض برای App Engine
- موتور برنامه پایتون ۲ (استاندارد) زمان اجرا
- موتور برنامه پایتون ۳ (استاندارد) زمان اجرا
- تفاوتهای بین زمانهای اجرای موتور برنامه پایتون ۲ و ۳ (استاندارد)
- راهنمای مهاجرت موتور برنامه پایتون ۲ به ۳ (استاندارد)
عملکردهای گوگل کلود
- صفحه اصلی توابع ابری
- مستندات توابع ابری
- شروع سریع توابع ابری پایتون
- حسابهای سرویس پیشفرض برای عملکردهای ابری
گوگل کلود ران
- صفحه اصلی کلود ران
- مستندات Cloud Run
- شروع سریع اجرای ابری پایتون
- حسابهای سرویس پیشفرض برای Cloud Run
بستههای ساخت ابری گوگل، رجیستری کانتینر، رجیستری مصنوعات
- اطلاعیه Cloud Buildpacks
- مخزن Cloud Buildpacks
- صفحه اصلی رجیستری آثار باستانی ابری
- مستندات رجیستری آثار باستانی ابری
- صفحه اصلی رجیستری کانتینر ابری
- مستندات رجیستری کانتینر ابری
ترجمه ابری گوگل و کیت یادگیری ماشین گوگل
- صفحه اصلی ترجمه ابری
- مستندات ترجمه ابری
- صفحه قیمتگذاری API ترجمه
- تمام APIهای «بلوک سازنده» هوش مصنوعی/یادگیری ماشین ابری
- کیت یادگیری ماشین گوگل (زیرمجموعه APIهای هوش مصنوعی/یادگیری ماشین ابری برای موبایل)
- API ترجمه کیت گوگل امال
سایر محصولات/صفحات Google Cloud
- پشتیبانی گوگل کلود از پایتون
- کتابخانههای کلاینت گوگل کلود
- سطح «همیشه رایگان» گوگل کلود
- تمام مستندات گوگل کلود
پایتون و فلاسک
مجوز
این آموزش تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است، در حالی که کد منبع موجود در مخزن تحت مجوز Apache 2 میباشد.