مجتبی حدادی
مجتبی حدادی
خواندن ۶ دقیقه·۵ سال پیش

حل مشکل Gradle برای دانلود از مخازن تحریم شده با راه اندازی Nexus Repository Manager ، یک بار برای همیشه!

همونطوری که میدونید Gradle برای اینکه بتونه پروژه ما رو بیلد کنه، باید نیازمندی های پروژه (Dependency) رو از مخازنی که براش تعریف کردیم (Repository) دانلود بکنه.
برای مثال فرض کنید ما کتابخونه Gson رو نیاز داریم که توی ()mavenCentral موجوده.

پس توی فایل build.gradle همچین چیزهایی خواهیم داشت.

allprojects { repositories { mavenCentral() } } dependencies { implementation 'com.google.code.gson:gson:2.8.5' }

حالا وقتی که پروژه مون رو بیلد میکنیم، Gradle میره اینجا , و فایل gson-2.8.5.jar رو پیدا میکنه و دانلودش میکنه.
ولی خب ما تحریمیم و دسترسی نداریم به این فایل! پس بیلد متوقف میشه !!
برای حل مشکل هم که مشخصه باید تحریم ها رو دور بزنیم. که توی این مطلب در موردش به صورت کامل توضیح داده شده. روش هایی مثل

اما یه مشکلاتی این روش ها دارند.

  • مثلا اینکه همیشه ازشون خیالت راحت نیست و زمانی که نیاز داری ریلیز بدی کار نمیکنن و پدر اعصابت رو درمیارن! (خودم زیاد درگیر این مورد بودم)
  • یا اگر یک تیم باشید که روی یک پروژه کار میکنید بعد از این که یکی از اعضای تیم یک Dependency رو اضافه میکنه یا اون رو آپدیت میکنه بدبختی اعضای دیگه تیم برای دانلود اون فایل شروع میشه :)
  • یا شرکتی که مصرف اینترنت کارکنان براش مهم باشه به دلیل اینکه فایل ها توسط هر سیستم دانلود میشن میزان حجم دانلود از اینترنت بالا میره.

خب راه حل چیه ؟
راه اندازی یک مخزن شخصی (Private Repository)

شرکت Sonatype یک Repository manager رایگان به نام Nexus داره که کارش راه اندازی مخزن شخصی روی سیستم خودمون هست.
کاری که ما قراره توسط Nexus انجام بدیم به این شکله که درخواست های دانلودی که Gradle داره، به جای اینکه مثلا به ()mavenCentral بره اول به مخزن شخصی ما میره و در صورتی که اون فایل رو داشته باشیم در اختیار Gradle قرار میگیره و در غیر این صورت توسط مخزن ما دانلود میشه و بعدش تحویل Gradle داده میشه و یک نسخه برای دفعات بعدی نگه داری میشه. تقریبا اتفاقی شبیه عکس پایین.

قسمت Local Repository همون مخزن شخصی ماست.
قسمت Local Repository همون مخزن شخصی ماست.


از این به بعد بقیه اعضای تیم نیازی به دانلود اون فایل از اینترنت ندارن و کافیه از طریق شبکه Local به مخزن شخصی ما وصل بشن.

خب شروع میکنیم

برای این کار نیاز داریم تا Nexus Repository Manager OSS رو دانلود و راه اندازی بکنیم. پس اگر ویندوزی هستیم به این صفحه میریم و ایمیل مون رو وارد میکنیم و فایل رو دانلود میکنیم.(نیاز به دور زدن تحریم داریم)

اگر مشکلی برای دانلود دارید من آخرین ورژن (3.17.0) رو که برای ویندوز 64 بیت دانلود کردم و اینجا گذاشتمش.

* برای Linux , Mac هم قابلیت راه اندازی وجود داره که اینجا در مورد مراحل ویندوز صحبت میکنیم.

حالا فایل فشرده دانلود شده رو Extract میکنیم و به مسیر زیر میریم.

extract place ==> nexus-3.17.0-01-win64 ==> nexus-3.17.0-01 ==> bin

اونجا cmd یا powerShell رو باز میکنیم و دستور run رو به این شکل اجرا میکنیم.

.\nexus.exe /run

حواستون باشه اواسط کار پیغامی میاد برای دادن دسترسی به اینترنت که شما باید allow access رو بزنید.

حالا منتظر میمونیم تا این پیغام رو روی صفحه ببینیم.

تبریک میگم. به همین سادگی repository manager تون راه اندازی شد.

حالا مرورگر وب تون رو باز کنید و به این آدرس برید.

http://localhost:8081/

بعد به منوی Browse برید. میبینید که اولین آیتم اون لیست maven-central هستش که با نوع Proxy به صورت پیش فرض تعریف شده و جلوش یک دکمه ی کپی وجود داره.

دکمه کپی رو بزنید تا دیالوگی که داخلش آدرسی شبیه آدرس زیر میاد رو ببینید.

http://localhost:8081/repository/maven-central/

این آدرس جایگزینی هست که Gradle باید به اون متصل بشه.
به صورت زیر به جای ()MavenCentral داخل Repository های پروژه مون تعریفش میکنیم.

در انتها فایل مون به این شکل میشه.

allprojects { repositories { // comment this line ==> mavenCentral() //add this line maven { url 'http://localhost:8081/repository/maven-central/' } } }

و تمام !

اینجا میتونید ویدیوی مراحل بالا رو ببینید

https://www.aparat.com/v/Qxt7f

حالا از این به بعد Gradle هر Dependency ای رو که لازم باشه از mavenCentral بگیره از سرور واسط ما دریافت میکنه.

* فقط نکته ای که وجود داره حواستون باشه اگر دفعه اولی هست که اون Dependency رو از سرور واسط درخواست میکنید. باید روش های قبلی (پراکسی یا تغییر DNS) رو انجام داده باشید.
https://www.aparat.com/v/PxL8D

اما یه سوالی پیش میاد!

سوال : همه ی Dependency های یک پروژه که توی MaveCentral نیست! ممکنه توی Jcenter یا مثلا مخزن Google یا هر جای دیگه ای باشه! تکلیف اونا چی میشه ...؟
جواب : خودمون اونها رو اضافه می کنیم.

فرض کنید میخواهیم Jcenter رو هم به لیست مخرن های سرور واسط اضافه کنیم.

برای این کار، یه بار دیگه وارد مرورگر بشید و به آدرسhttp://localhost:8081/ برید، بالا سمت راست روی لاگین کلیک کنید اگر اولین باری هست که میخواهید لاگین کنید برای user name مقدار admin رو وارد کنید. و برای پسورد به این مسیر برید.

extract place ==> nexus-3.17.0-01-win64 ==> sonatype-work ==> nexus3

اینجا یه فایل به نام admin.password وجود داره که رمز admin داخلش وجود داره.اون رو کپی کنید و لاگین کنید. حواستون باشه رمز رو ذخیره کنید. چون بعد از لاگین این فایل پاک میشه.

حالا به قسمت settings برید و از منوی کناری Repositories رو انتخاب کنید. با زدن دکمه create repository یک لیست براتون باز میشه که حالت های مختلف ساختن مخازن هست.
برای این که Gradle پروتکل های Maven رو میشناسه پس نوع مخزن مون باید maven 2 باشه و این رفتاری که ما از مخزن میخاهیم (این که بهش وصل شیم و به عنوان یه آینه عمل بکنه) بهش Proxy گفته میشه.
پس از توی لیست (maven 2 (proxy رو انتخاب کنید. تا صفحه ی زیر باز بشه.
اینجا وارد جزئیات نمیشم، فقط دوتا فیلد اجباری رو وارد میکنیم.

برای مقدار Name مثلا مینویسیم proxy-jcenter-repo و برای remote storage آدرس زیر رو وارد میکنیم

https://jcenter.bintray.com/

شاید براتون سوال پیش بیاد آدرس ریپازیتوری jcenter رو از کجا آوردم؟! که البته چیز خاصی نیست با یه سرچ بهش میرسید.
ولی خب راه دیگه ای مثل خودندن داکیومنت ها وجود داره که توی ویدیوی زیر نشونش دادم.

https://www.aparat.com/v/YjxWf
حالامثل()mavenCentralکهتوضیحدادمتویbuild.gradleمقدار()Jcenterروبهمقدارزیرتغییرمیدیموتمام.
maven {url 'http://localhost:8081/repository/proxy-jcenter-repo/'}

این کار رو برای همه ی مخزن های پروژه انجام میدیم و در آخر هم با بیلد کردن Gradle همه فایل ها داخل سرور لوکال ما قرار میگیرند و از این به بعد دسترسی به اینترنت نیاز نخواهد بود.

فقط یادتون باشه برای دفعات بعد نیاز نیست کار خاصی بکنید و فقط کافیه که Repository تون رو run/ بکنید و بدون هیچ مشکلی بابت Dependency های پروژه به برنامه نویسی خودتون برسید.

تنظیم پراکسی

اگر نیاز داشتین که برای سرور واسط تون Proxy ست کنید تنها کافیه توی تنظیمات دنبال منوی HTTP بگردید و مثل عکس زیر تنظیمش کنید.

تنظیم Proxy
تنظیم Proxy



خب فکر میکنم آموزش تا همینجا کفایت میکنه و شما هم متوجه اصل موضوع شده باشید.
امیدوارم این روش مشکلات تون رو بتونه کاهش بده.
اگر سوالی داشتید خوشحال میشم بتونم بهش پاسخ بدم.

ممنون از وقتی که گذاشتید.
موفق باشید.

اندرویدگریدلجاواتحریم
برنامه نویس اندروید - اسنپ
شاید از این پست‌ها خوشتان بیاید