سرور مجازی

۲ مطلب با کلمه‌ی کلیدی «خرید سرور مجازی لهستان» ثبت شده است

  • ۰
  • ۰

 نحوه کار با فایل های فشرده در Node.js

ورود به سایت

 

معرفی

کار با فایل ها یکی از کارهای رایج در بین توسعه دهندگان است. با افزایش حجم فایل های شما، فضای قابل توجهی روی هارد دیسک شما اشغال می شود. دیر یا زود ممکن است لازم باشد فایل ها را به سرورهای دیگر منتقل کنید یا چندین فایل را از دستگاه محلی خود به سیستم عامل های مختلف آپلود کنید. برخی از این پلتفرم ها محدودیت اندازه فایل دارند و فایل های بزرگ را نمی پذیرند. برای حل این مشکل، می توانید فایل ها را در یک فایل ZIP گروه بندی کنید. فایل ZIP یک فرمت آرشیو است که فایل ها را با الگوریتم فشرده سازی بدون اتلاف فشرده و فشرده می کند. الگوریتم می تواند داده ها را بدون از دست دادن داده ها بازسازی کند. در Node.js، می توانید از ماژول adm-zip برای ایجاد و خواندن آرشیوهای ZIP استفاده کنید.

در این آموزش از ماژول adm-zip برای فشرده سازی، خواندن و از حالت فشرده خارج کردن فایل ها استفاده خواهید کرد. ابتدا چندین فایل را با استفاده از adm-zip در یک آرشیو ZIP ترکیب می‌کنید. سپس محتویات بایگانی ZIP را فهرست می کنید. پس از آن، یک فایل را به یک بایگانی ZIP موجود اضافه می‌کنید و در نهایت، یک بایگانی ZIP را در یک فهرست استخراج می‌کنید.

پیش نیازها

برای دنبال کردن این آموزش، شما نیاز دارید:

  • نصب Node.js روی محیط محلی یا سرور شما
  • آشنایی با نحوه نوشتن یک برنامه Node.js
  • درک اولیه از برنامه نویسی ناهمزمان در جاوا اسکریپت.
  • آشنایی با نحوه کار با فایل ها در Node.js.

مرحله 1 – راه اندازی پروژه

در این مرحله، دایرکتوری پروژه خود را ایجاد کرده و adm-zip را به عنوان یک وابستگی نصب می‌کنید. این دایرکتوری جایی است که شما فایل های برنامه خود را نگه می دارید. همچنین دایرکتوری دیگری حاوی فایل های متنی و تصویر ایجاد خواهید کرد. شما این فهرست را در بخش بعدی بایگانی خواهید کرد.

با دستور زیر یک دایرکتوری به نام zip_app ایجاد کنید:

  • mkdir zip_app

با دستور cd به پوشه جدید ایجاد شده بروید:

cd zip_app

در داخل دایرکتوری، یک فایل package.json برای مدیریت وابستگی های پروژه ایجاد کنید:

npm init -y

گزینه -y یک فایل پیش فرض package.json ایجاد می کند.

بعد، adm-zip را با دستور npm install نصب کنید:

npm install adm-zip

پس از اجرای دستور، npm adm-zip را نصب کرده و فایل package.json را به روز می کند.

سپس یک دایرکتوری به نام test ایجاد کنید و وارد آن شوید:

mkdir test && cd test

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

file1.txt را ایجاد کنید و با استفاده از دستور زیر آن را با محتوای ساختگی پر کنید:

yes “dummy content” | head -n 100000 > file1.txt

دستور yes محتوای ساختگی رشته را به طور مکرر ثبت می کند. با استفاده از دستور pipe |، خروجی را از دستور yes ارسال می کنید تا به عنوان ورودی دستور head استفاده شود. دستور head بخشی از ورودی داده شده را در خروجی استاندارد چاپ می کند. گزینه -n تعداد خطوطی که باید در خروجی استاندارد نوشته شود را مشخص می کند. در نهایت، خروجی سر را با استفاده از > به فایل جدید file1.txt هدایت می‌کنید.

یک فایل دوم با رشته “محتوای ساختگی” تکرار شده 300000 خط ایجاد کنید:

yes “dummy content” | head -n 300000 > file2.txt

فایل دیگری با رشته محتوای ساختگی که 600000 خط تکرار شده است ایجاد کنید:

yes “dummy content” | head -n 600000 > file3.txt

در نهایت، یک تصویر را با استفاده از curl در دایرکتوری دانلود کنید:

curl -O https://assets.vpsgol.net/how-to-process-images-in-node-js-with-sharp/underwater.png

با دستور زیر به دایرکتوری اصلی پروژه برگردید:

cd ..

.. شما را به دایرکتوری والد که zip_app است منتقل می کند.

اکنون دایرکتوری پروژه را ایجاد کرده اید، adm-zip را نصب کرده اید و یک دایرکتوری با فایل ها برای بایگانی ایجاد کرده اید. در مرحله بعدی، یک دایرکتوری را با استفاده از ماژول adm-zip بایگانی خواهید کرد.

مرحله 2 – ایجاد یک آرشیو ZIP

در این مرحله از adm-zip برای فشرده سازی و بایگانی دایرکتوری که در قسمت قبل ایجاد کرده اید استفاده می کنید.

برای بایگانی دایرکتوری، ماژول adm-zip را وارد کرده و از روش addLocalFolder() ماژول برای اضافه کردن دایرکتوری به شی ZIP ماژول adm-zip استفاده می کنید. پس از آن، از متد writeZip() ماژول برای ذخیره آرشیو در سیستم محلی خود استفاده خواهید کرد.

یک فایل جدید createArchive.js در ویرایشگر متن دلخواه خود ایجاد و باز کنید. این آموزش از nano، یک ویرایشگر متن خط فرمان استفاده می کند:

nano createArchive.js

سپس، در ماژول adm-zip در فایل createArchive.js خود نیاز دارید:

zip_app/createArchive.js

const AdmZip = require("adm-zip");

ماژول adm-zip کلاسی را ارائه می دهد که حاوی متدهایی برای ایجاد آرشیو ZIP است.

از آنجایی که در طول فرآیند بایگانی با فایل‌های بزرگ مواجه می‌شوید، ممکن است تا زمانی که بایگانی ZIP ذخیره نشود، رشته اصلی را مسدود کنید. برای نوشتن کد غیر مسدود کننده، یک تابع ناهمزمان برای ایجاد و ذخیره یک آرشیو ZIP تعریف می کنید.

در فایل createArchive.js خود، کد هایلایت شده زیر را اضافه کنید:

zip_app/createArchive.js

const AdmZip = require("adm-zip");

async function createZipArchive() {
  const zip = new AdmZip();
  const outputFile = "test.zip";
  zip.addLocalFolder("./test");
  zip.writeZip(outputFile);
  console.log(`Created ${outputFile} successfully`);
}

createZipArchive();

 

createZipArchive یک تابع ناهمزمان است که یک آرشیو ZIP از یک دایرکتوری مشخص ایجاد می کند. چیزی که آن را ناهمزمان می کند، کلمه کلیدی async است که قبل از برچسب تابع تعریف کرده اید. در داخل تابع، نمونه‌ای از ماژول adm-zip ایجاد می‌کنید که روش‌هایی را ارائه می‌کند که می‌توانید برای خواندن و ایجاد آرشیو استفاده کنید. هنگامی که یک نمونه ایجاد می کنید، adm-zip یک ZIP درون حافظه ایجاد می کند که در آن می توانید فایل ها یا دایرکتوری ها را اضافه کنید.

در مرحله بعد، نام بایگانی را تعریف کرده و آن را در متغیر outputDir ذخیره می کنید. برای افزودن دایرکتوری آزمایشی به آرشیو درون حافظه، متد addLocalFolder() را از adm-zip با مسیر دایرکتوری به عنوان آرگومان فراخوانی می کنید.

پس از اضافه شدن دایرکتوری، شما متد writeZip() را از adm-zip با متغیری حاوی نام آرشیو ZIP فراخوانی می کنید. متد writeZip() آرشیو را در دیسک محلی شما ذخیره می کند.

پس از انجام این کار، console.log() را فراخوانی کنید تا ثبت کنید که فایل ZIP با موفقیت ایجاد شده است.

در نهایت، تابع createZipArchive() را فراخوانی می کنید.

قبل از اجرای فایل، کد را در یک بلوک try…catch بپیچید تا خطاهای زمان اجرا را مدیریت کنید:

zip_app/createArchive.js

const AdmZip = require("adm-zip");

async function createZipArchive() {
  try {
    const zip = new AdmZip();
    const outputFile = "test.zip";
    zip.addLocalFolder("./test");
    zip.writeZip(outputFile);
    console.log(`Created ${outputFile} successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

createZipArchive();

در داخل بلوک try، کد سعی می کند یک بایگانی ZIP ایجاد کند. در صورت موفقیت آمیز بودن، تابع ()createZipArchive با پرش از بلوک catch خارج می شود. اگر ایجاد یک بایگانی ZIP باعث خطا شود، اجرا به بلوک catch پرش می‌کند و خطا را در کنسول ثبت می‌کند.

با CTRL+X فایل را در نانو ذخیره کرده و از آن خارج شوید. برای ذخیره تغییرات، y را وارد کنید و با فشار دادن ENTER در ویندوز یا کلید RETURN در مک، فایل را تأیید کنید.

فایل createArchive.js را با استفاده از دستور node اجرا کنید:

node createArchive.js

خروجی زیر را دریافت خواهید کرد:

 

Output

Created test.zip successfully

محتویات دایرکتوری را فهرست کنید تا ببینید آیا آرشیو ZIP ایجاد شده است یا خیر:

ls

خروجی زیر را دریافت خواهید کرد که آرشیو را در میان مطالب نشان می دهد:

 

Output

createArchive.js  node_modules  package-lock.json
package.json  test  test.zip

با تأیید اینکه بایگانی ZIP ایجاد شده است، بایگانی ZIP و اندازه فایل دایرکتوری آزمایشی را با هم مقایسه می کنید تا ببینید فشرده سازی کار می کند یا خیر.

اندازه دایرکتوری تست را با استفاده از دستور du بررسی کنید:

du -h test

پرچم -h به du دستور می دهد که اندازه فهرست را در قالبی قابل خواندن توسط انسان نشان دهد.

پس از اجرای دستور، خروجی زیر را دریافت خواهید کرد:

 

Output

15M test

سپس، اندازه فایل بایگانی test.zip را بررسی کنید:

du -h test.zip

دستور du خروجی زیر را ثبت می کند:

 

Output

760K    test.zip

همانطور که می بینید، ایجاد فایل ZIP اندازه دایرکتوری را از 15 مگابایت (مگابایت) به 760 کیلوبایت (KB) کاهش داده است، که یک تفاوت بزرگ است. فایل ZIP قابل حمل تر و اندازه کوچکتر است.

اکنون که یک بایگانی ZIP ایجاد کردید، آماده فهرست کردن محتویات در یک فایل ZIP هستید.

مرحله 3 – فهرست کردن فایل ها در آرشیو ZIP

در این مرحله، با استفاده از adm-zip، تمام فایل‌های موجود در آرشیو ZIP را می‌خوانید و فهرست می‌کنید. برای انجام این کار، ماژول adm-zip را با مسیر آرشیو ZIP خود نمونه سازی می کنید. سپس متد ()getEntries ماژول را فراخوانی می کنید که آرایه ای از اشیاء را برمی گرداند. هر شی اطلاعات مهمی در مورد یک آیتم در آرشیو ZIP دارد. برای فهرست کردن فایل‌ها، روی آرایه تکرار می‌کنید و از شی به نام فایل دسترسی پیدا می‌کنید و آن را در کنسول وارد می‌کنید.

readArchive.js را در ویرایشگر متن دلخواه خود ایجاد و باز کنید:

nano readArchive.js

در readArchive.js خود، کد زیر را برای خواندن و فهرست کردن محتویات یک بایگانی ZIP اضافه کنید:

zip_app/readArchive.js

const AdmZip = require("adm-zip");

async function readZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    for (const zipEntry of zip.getEntries()) {
      console.log(zipEntry.toString());
    }
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

readZipArchive("./test.zip");

ابتدا به ماژول adm-zip نیاز دارید.

در مرحله بعد، تابع readZipArchive() را تعریف می کنید که یک تابع ناهمزمان است. در داخل تابع، یک نمونه از adm-zip با مسیر فایل ZIP که می‌خواهید بخوانید ایجاد می‌کنید. مسیر فایل توسط پارامتر filepath ارائه می شود. adm-zip فایل را می خواند و آن را تجزیه می کند.

پس از خواندن بایگانی، یک عبارت for…of تعریف می کنید که روی اشیاء در آرایه ای تکرار می شود که متد getEntries() از adm-zip هنگام فراخوانی آن را برمی گرداند. در هر تکرار، شی به متغیر zipEntry اختصاص داده می شود. در داخل حلقه، شما شی را به رشته ای تبدیل می کنید که شی را با استفاده از متد Node.js toString() نشان می دهد، سپس با استفاده از متد console.log() آن را در کنسول وارد می کنید.

در نهایت، تابع readZipArchive() را با مسیر فایل آرشیو ZIP به عنوان آرگومان فراخوانی می کنید.

فایل خود را ذخیره کرده و از آن خارج شوید، سپس فایل را با دستور زیر اجرا کنید:

node readArchive.js

خروجی مشابه موارد زیر را دریافت خواهید کرد (ویرایش شده برای اختصار):

 

Output

{
    "entryName": "file1.txt",
    "name": "file1.txt",
    "comment": "",
    "isDirectory": false,
    "header": {
        ...
    },
    "compressedData": "<27547 bytes buffer>",
    "data": "<null>"
}
...

کنسول چهار شی را ثبت می کند. سایر اشیاء ویرایش شده اند تا آموزش مختصر بماند.

هر فایل در بایگانی با یک شی شبیه به آنچه در خروجی قبلی است نشان داده می شود. برای دریافت نام فایل برای هر فایل، باید به ویژگی name دسترسی داشته باشید.

در فایل readArchive.js خود، کد هایلایت شده زیر را برای دسترسی به هر نام فایل اضافه کنید:

zip_app/readArchive.js

const AdmZip = require("adm-zip");

async function readZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    for (const zipEntry of zip.getEntries()) {
      console.log(zipEntry.name);
    }
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

readZipArchive("./test.zip");

ویرایشگر متن خود را ذخیره کرده و از آن خارج شوید. حالا با دستور node دوباره فایل را اجرا کنید:

node readArchive.js

با اجرای فایل خروجی زیر حاصل می شود:

 

Output

file1.txt
file2.txt
file3.txt
underwater.png

اکنون خروجی نام فایل هر فایل را در آرشیو ZIP ثبت می کند.

اکنون می توانید هر فایل را در یک آرشیو ZIP بخوانید و فهرست کنید. در بخش بعدی، فایلی را به آرشیو ZIP موجود اضافه می‌کنید.

مرحله 4 – افزودن یک فایل به یک بایگانی موجود

در این مرحله، یک فایل ایجاد می‌کنید و بدون استخراج آن، آن را به بایگانی ZIP که قبلا ایجاد کرده‌اید، اضافه می‌کنید. ابتدا، با ایجاد یک نمونه adm-zip، آرشیو ZIP را می خوانید. دوم، شما از متد ()addFile ماژول برای اضافه کردن فایل در ZIP استفاده می کنید. در نهایت، بایگانی ZIP را در سیستم محلی ذخیره خواهید کرد.

یک فایل file4.txt با محتوای ساختگی که 600000 خط تکرار شده است ایجاد کنید:

yes “dummy content” | head -n 600000 > file4.txt

updateArchive.js را در ویرایشگر متن خود ایجاد و باز کنید:

nano updateArchive.js

در ماژول adm-zip و ماژول fs که به شما امکان می دهد با فایل های موجود در فایل updateArchive.js خود کار کنید، نیاز دارید:

const AdmZip = require("adm-zip");
const fs = require("fs").promises;

شما نیاز به نسخه مبتنی بر وعده از نسخه ماژول fs دارید که به شما امکان می دهد کدهای ناهمزمان بنویسید. هنگامی که شما یک متد fs را فراخوانی می کنید، یک وعده برمی گرداند.

سپس در فایل updateArchive.js خود، کد برجسته شده زیر را برای افزودن یک فایل جدید به بایگانی ZIP اضافه کنید:

zip_app/updateArchive.js

const AdmZip = require("adm-zip");
const fs = require("fs").promises;

async function updateZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    content = await fs.readFile("./file4.txt");
    zip.addFile("file4.txt", content);
    zip.writeZip(filepath);
    console.log(`Updated ${filepath} successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

updateZipArchive("./test.zip");

updateZipArchive یک تابع ناهمزمان است که یک فایل را در سیستم فایل می خواند و آن را به یک ZIP موجود اضافه می کند. در تابع، شما یک نمونه از adm-zip را با مسیر فایل آرشیو ZIP در مسیر فایل به عنوان پارامتر ایجاد می کنید. در مرحله بعد، متد readFile() ماژول fs را برای خواندن فایل در سیستم فایل فراخوانی می کنید. متد readFile() یک وعده را برمی‌گرداند که با کلمه کلیدی await حل می‌کنید (wait فقط در توابع ناهمزمان معتبر است). پس از حل شدن، متد یک شی بافر را برمی گرداند که حاوی محتویات فایل است.

در مرحله بعد، متد addFile() را از adm-zip فراخوانی می کنید. این روش دو آرگومان می گیرد. آرگومان اول نام فایلی است که می خواهید به آرشیو اضافه کنید و آرگومان دوم شی بافر حاوی محتویات فایلی است که متد readFile() می خواند.

پس از آن، متد writeZip ماژول adm-zip را برای ذخیره و نوشتن تغییرات جدید در آرشیو ZIP فراخوانی می‌کنید. پس از انجام این کار، متد console.log() را برای ثبت یک پیام موفقیت آمیز فراخوانی می کنید.

در نهایت، تابع updateZipArchive() را با مسیر فایل آرشیو Zip به عنوان آرگومان فراخوانی می کنید.

فایل خود را ذخیره کرده و از آن خارج شوید. فایل updateArchive.js را با دستور زیر اجرا کنید:

node updateArchive.js

خروجی را به این صورت خواهید دید:

 

Output

Updated ./test.zip successfully

اکنون، تأیید کنید که آرشیو ZIP حاوی فایل جدید است. فایل readArchive.js را اجرا کنید تا محتویات آرشیو ZIP را با دستور زیر فهرست کنید:

node readArchive.js

خروجی را به این صورت خواهید دید:

 

Output

Updated ./test.zip successfully

اکنون، تأیید کنید که آرشیو ZIP حاوی فایل جدید است. فایل readArchive.js را اجرا کنید تا محتویات آرشیو ZIP را با دستور زیر فهرست کنید:

node readArchive.js

خروجی زیر را دریافت خواهید کرد:

file1.txt
file2.txt
file3.txt
file4.txt
underwater.png

این تایید می کند که فایل به ZIP اضافه شده است.

اکنون که می توانید یک فایل را به یک بایگانی موجود اضافه کنید، بایگانی را در بخش بعدی استخراج خواهید کرد.

مرحله 5 – استخراج یک بایگانی فشرده

در این مرحله، تمام محتویات یک بایگانی ZIP را می خوانید و در یک دایرکتوری استخراج می کنید. برای استخراج بایگانی ZIP، adm-zip را با مسیر فایل بایگانی نمونه‌سازی می‌کنید. پس از آن، متد ()extractAllTo ماژول را با نام دایرکتوری که می‌خواهید محتوای ZIP استخراج‌شده شما در آن قرار گیرد، فراخوانی می‌کنید.

ExtractArchive.js را در ویرایشگر متن خود ایجاد و باز کنید:

nano extractArchive.js

در ماژول adm-zip و ماژول مسیر در فایل extractArchive.js خود نیاز دارید:

zip_app/extractArchive.js

const AdmZip = require("adm-zip");
const path = require("path");

ماژول مسیر روش های مفیدی را برای برخورد با مسیرهای فایل ارائه می دهد.

هنوز در فایل extractArchive.js خود، کد هایلایت شده زیر را برای استخراج آرشیو اضافه کنید:

zip_app/extractArchive.js

const AdmZip = require("adm-zip");
const path = require("path");

async function extractArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);
    const outputDir = `${path.parse(filepath).name}_extracted`;
    zip.extractAllTo(outputDir);

    console.log(`Extracted to "${outputDir}" successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

extractArchive("./test.zip");

ExtractArchive() یک تابع ناهمزمان است که پارامتری حاوی مسیر فایل بایگانی ZIP را می گیرد. در داخل تابع، adm-zip را با مسیر فایل بایگانی ZIP ارائه شده توسط پارامتر filepath، نمونه سازی می کنید.

بعد، شما یک الگو را به معنای واقعی کلمه تعریف می کنید. در داخل مکان‌نمای تحت اللفظی الگو (${})، متد parse() را از ماژول path با مسیر فایل فراخوانی می‌کنید. متد parse() یک شی را برمی گرداند. برای دریافت نام فایل ZIP بدون پسوند فایل، ویژگی name را به شیئی که متد parse() برمی گرداند اضافه می کنید. هنگامی که نام بایگانی برگردانده شد، الگو به معنای واقعی کلمه مقدار را با رشته _extracted درون یابی می کند. سپس مقدار در متغیر outputDir ذخیره می شود. این نام دایرکتوری استخراج شده خواهد بود.

در مرحله بعد، متد ExtractAllTo ماژول adm-zip را با نام دایرکتوری ذخیره شده در outputDir برای استخراج محتویات در دایرکتوری فراخوانی می کنید. پس از آن، برای ثبت یک پیام موفقیت آمیز، console.log() را فراخوانی می کنید.

در نهایت، تابع extractArchive() را با مسیر آرشیو ZIP فراخوانی می کنید.

فایل خود را ذخیره کنید و از ویرایشگر خارج شوید، سپس فایل extractArchive.js را با دستور زیر اجرا کنید:

node extractArchive.js

خروجی زیر را دریافت می کنید:

 

Output

Extracted to "test_extracted" successfully

تأیید کنید که دایرکتوری حاوی محتویات ZIP ایجاد شده است:

ls

خروجی زیر را دریافت خواهید کرد:

 

Output

createArchive.js   file4.txt   package-lock.json
readArchive.js  test.zip        updateArchive.js
extractArchive.js  node_modules  package.json
test           test_extracted

اکنون به دایرکتوری حاوی محتویات استخراج شده بروید:

cd test_extracted

فهرست مطالب در دایرکتوری:

ls

خروجی زیر را دریافت خواهید کرد:

 

Output

file1.txt  file2.txt  file3.txt  file4.txt  underwater.png

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

شما اکنون محتوای آرشیو ZIP را در یک فهرست استخراج کرده اید.

نتیجه

در این آموزش، شما یک بایگانی ZIP ایجاد کردید، محتویات آن را فهرست کردید، یک فایل جدید به آرشیو اضافه کردید و تمام محتوای آن را با استفاده از ماژول adm-zip در یک فهرست استخراج کردید. این به عنوان پایه خوبی برای کار با آرشیوهای ZIP در Node.js خواهد بود.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:Node.jsپلتفرم جاواجاواخرید سرور مجازیسرورسرور مجازیفشرده سازی در Node.jsنصب Node.js

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه از یک ماژول خصوصی Go در پروژه خود استفاده کنید

ورود به سایت

 

 

 

معرفی

یکی از جنبه های مفید اکوسیستم Go این است که تعداد زیادی از ماژول ها منبع باز هستند. از آنجایی که آنها منبع باز هستند، می توان آزادانه به آنها دسترسی داشت، بررسی کرد، استفاده کرد و از آنها آموخت. با این حال، گاهی اوقات لازم است یک ماژول Go خصوصی به دلایل مختلف مانند حفظ منطق تجاری اختصاصی در شرکت خود ایجاد کنید.

در این آموزش، ماژول Go خصوصی را منتشر می‌کنید، احراز هویت را برای دسترسی به یک ماژول خصوصی تنظیم می‌کنید و از ماژول Go خصوصی در پروژه استفاده می‌کنید.

پیش نیازها

  • Go نسخه 1.16 یا بالاتر نصب شده است، که می توانید با دنبال کردن سری ما، نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای Go، این کار را انجام دهید.
  • درک توزیع ماژول های Go،
  • آشنایی با Git،
  • یک مخزن خصوصی خالی GitHub با نام mysecret برای ماژول خصوصی منتشر شده شما.
  • یک رمز دسترسی شخصی GitHub با دسترسی به خواندن از مخازن شما. از این برای اجازه دسترسی Go به مخزن خصوصی شما استفاده خواهید کرد.

توزیع یک ماژول خصوصی

برخلاف بسیاری از زبان های برنامه نویسی، Go ماژول ها را به جای سرور بسته مرکزی از مخازن توزیع می کند. یکی از مزایای این رویکرد این است که انتشار یک ماژول خصوصی بسیار شبیه به انتشار یک ماژول عمومی است. به جای نیاز به یک سرور بسته خصوصی کاملاً مجزا، یک ماژول خصوصی Go از طریق یک مخزن کد منبع خصوصی توزیع می شود. از آنجایی که اکثر گزینه‌های میزبانی کد منبع از این امر پشتیبانی می‌کنند، نیازی به راه‌اندازی یک سرور خصوصی اضافی نیست.

برای استفاده از یک ماژول خصوصی، باید به یک ماژول خصوصی Go دسترسی داشته باشید. در این بخش، یک ماژول خصوصی ایجاد و منتشر می‌کنید که می‌توانید بعداً در آموزش از آن برای دسترسی به یک ماژول خصوصی از برنامه Go دیگر استفاده کنید.

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

دایرکتوری پروژه ها را بسازید و به آن بروید:

mkdir projects

cd projects

از دایرکتوری پروژه‌ها، git clone را اجرا کنید تا مخزن mysecret خصوصی شما در رایانه شما کلون شود:

git clone git@github.com:your_github_username/mysecret.git

Git تایید می کند که ماژول شما را شبیه سازی کرده است و ممکن است به شما هشدار دهد که یک مخزن خالی را شبیه سازی کرده اید. اگر چنین است، این چیزی نیست که باید نگران آن باشید:

 

Output

Cloning into 'mysecret'...
warning: You appear to have cloned an empty repository.

در مرحله بعد، از cd برای رفتن به دایرکتوری mysecret جدیدی که کلون کرده اید استفاده کنید و از go mod init به همراه نام مخزن خصوصی خود برای ایجاد یک ماژول Go جدید استفاده کنید:

cd mysecret

go mod init github.com/your_github_username/mysecret

اکنون که ماژول شما ایجاد شد، زمان آن رسیده است که تابعی را اضافه کنید که می توانید از پروژه دیگری استفاده کنید. از nano یا ویرایشگر متن مورد علاقه خود برای باز کردن فایلی با همان نام مخزن خود مانند mysecret.go استفاده کنید. نام مهم نیست و می‌تواند هر چیزی باشد، اما استفاده از همان نام مخزن، تشخیص اینکه در هنگام کار با یک ماژول جدید، ابتدا به کدام فایل نگاه کنید، آسان‌تر می‌شود:

nano mysecret.go

در فایل mysecret.go، بسته را با همان نام مخزن خود نامگذاری کنید، سپس یک تابع SecretProcess برای چاپ خط Running the secret اضافه کنید! هنگام تماس:

projects/mysecret/mysecret.go

package mysecret

import "fmt"

func SecretProcess() {
    fmt.Println("Running the secret process!")
}

اکنون که ماژول خصوصی خود را ایجاد کرده اید، آن را در مخزن خصوصی خود منتشر می کنید تا دیگران از آن استفاده کنند. از آنجایی که مخزن خصوصی شما فقط در ابتدا به شما امکان دسترسی به آن را می دهد، می توانید کنترل کنید که چه کسی به ماژول خصوصی شما دسترسی دارد. ممکن است دسترسی به خودتان را محدود کنید، اما می‌توانید به دوستان یا همکاران نیز دسترسی داشته باشید.

از آنجایی که هر دو ماژول Go خصوصی و عمومی مخازن منبع هستند، انتشار یک ماژول Go خصوصی همان فرآیند انتشار عمومی را دنبال می کند. برای انتشار ماژول جدید خود، تغییرات خود را با استفاده از دستور git add در فهرست فعلی مرحله بندی کنید، سپس با دستور git commit آن تغییرات را در مخزن محلی خود انجام دهید:

git add .

git commit -m “Initial private module implementation”

تأییدیه ای از Git مبنی بر موفقیت آمیز بودن commit اولیه و همچنین خلاصه ای از فایل های موجود در commit را مشاهده خواهید کرد:

 

Output

[main (root-commit) bda059d] Initial private module implementation
 2 files changed, 10 insertions(+)
 create mode 100644 go.mod
 create mode 100644 mysecret.go

اکنون تنها قسمت باقی مانده این است که تغییرات خود را به مخزن GitHub خود منتقل کنید. مشابه یک ماژول عمومی، از دستور git push برای انتشار کد خود استفاده کنید:

git push

سپس Git تغییرات شما را تحت فشار قرار می دهد و آنها را برای هر کسی که به مخزن خصوصی شما دسترسی دارد در دسترس قرار می دهد:

git push origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 404 bytes | 404.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:your_github_username/mysecret.git
 * [new branch]      main -> main

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

در این بخش، ماژول جدیدی با تابع SecretProcess ایجاد کردید و آن را در مخزن mysecret خصوصی GitHub خود منتشر کردید و آن را به یک ماژول Go خصوصی تبدیل کردید. با این حال، برای دسترسی به این ماژول از برنامه Go دیگر، باید Go را پیکربندی کنید تا بداند چگونه به ماژول دسترسی پیدا کند.

پیکربندی رفتن به دسترسی به ماژول های خصوصی

در حالی که ماژول‌های Go معمولاً از مخازن کد منبع خود توزیع می‌شوند، تیم Go همچنین چند سرویس ماژول مرکزی Go را اجرا می‌کند تا اطمینان حاصل شود که اگر اتفاقی برای مخزن اصلی بیفتد، ماژول‌ها همچنان وجود دارند. به‌طور پیش‌فرض، Go برای استفاده از این سرویس‌ها پیکربندی شده است، اما وقتی می‌خواهید یک ماژول خصوصی را دانلود کنید، می‌توانند مشکلاتی ایجاد کنند زیرا به آن ماژول‌ها دسترسی ندارند. برای اینکه به Go بگویید برخی از مسیرهای واردات خصوصی هستند و نباید از سرویس‌های مرکزی Go استفاده کند، می‌توانید از متغیر محیطی GOPRIVATE استفاده کنید. متغیر محیطی GOPRIVATE فهرستی از پیشوندهای مسیر واردات است که با کاما از هم جدا شده‌اند که در آن ابزارهای Go سعی می‌کنند به جای رفتن از طریق سرویس‌های مرکزی مستقیماً به آنها دسترسی پیدا کنند. یکی از این نمونه ها ماژول خصوصی است که شما ایجاد کرده اید.

برای استفاده از ماژول خصوصی، با تنظیم آن در متغیر GOPRIVATE، به Go بگویید کدام مسیر را خصوصی در نظر بگیرید. هنگام تنظیم مقادیر متغیر GOPRIVATE، چند انتخاب وجود دارد. یک گزینه این است که GOPRIVATE را روی github.com تنظیم کنید. اگرچه ممکن است این چیزی نباشد که شما به دنبال آن هستید، زیرا این امر به Go می‌گوید که از خدمات مرکزی برای هر ماژول میزبانی شده در github.com، از جمله مواردی که مال شما نیستند، استفاده نکند.

گزینه بعدی این است که GOPRIVATE را فقط روی مسیر کاربری خود تنظیم کنید، مانند github.com/your_github_username. این مشکل در نظر گرفتن تمام GitHub خصوصی را حل می کند، اما در برخی مواقع ممکن است ماژول های عمومی ایجاد کنید که بخواهید از طریق آینه ماژول Go دانلود کنید. انجام این کار هیچ مشکلی ایجاد نمی کند و یک گزینه کاملا منطقی خواهد بود، اما شما همچنین می توانید این گزینه را دقیق تر کنید.

خاص ترین گزینه تنظیم GOPRIVATE برای مطابقت دقیق با مسیر ماژول شما است، مانند: github.com/your_github_username/mysecret. این هر دو مشکل از گزینه های قبلی را حل می کند، اما همچنین مشکلی را معرفی می کند که باید هر یک از مخازن خصوصی خود را به صورت جداگانه به GOPRIVATE اضافه کنید، مانند نشان داده شده در اینجا:

GOPRIVATE=github.com/your_github_username/mysecret,github.com/your_github_username/othersecret

انتخاب بهترین گزینه برای خود به سنجش مزایا و معایب در موقعیت شما بستگی دارد.

از آنجایی که اکنون فقط یک ماژول خصوصی دارید، از نام مخزن کامل برای مقدار استفاده خواهیم کرد. برای تنظیم متغیر محیطی GOPRIVATE=github.com/your_github_username/mysecret در ترمینال فعلی خود، از دستور صادرات استفاده کنید:

export GOPRIVATE=github.com/your_github_username/mysecret

اگر می خواهید دوباره بررسی کنید که تنظیم شده است، می توانید از دستور env به همراه grep برای بررسی نام GOPRIVATE استفاده کنید:

env | grep GOPRIVATE

 

Output

GOPRIVATE=github.com/your_github_username/mysecret

اگرچه Go اکنون می داند که ماژول شما خصوصی است، هنوز برای استفاده از ماژول کافی نیست. اگر سعی کنید ماژول خصوصی خود را به ماژول دیگری وارد کنید، احتمالاً خطای مشابه زیر را مشاهده خواهید کرد:

go get github.com/your_github_username/mysecret

 

Output

go get: module github.com/your_github_username/mysecret: git ls-remote -q origin in /Users/your_github_username/go/pkg/mod/cache/vcs/2f8c...b9ea: exit status 128:
    fatal: could not read Username for 'https://github.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
 

این پیغام خطا می گوید Go سعی کرد ماژول شما را دانلود کند، اما با چیزی مواجه شد که هنوز به آن دسترسی ندارد. از آنجایی که Git برای دانلود ماژول استفاده می شود، معمولاً از شما می خواهد که اعتبار خود را وارد کنید. با این حال، در این مورد، Go Git را برای شما فراخوانی می‌کند و نمی‌تواند برای آن‌ها درخواست کند. در این مرحله، برای دسترسی به ماژول خود باید راهی برای Git ارائه دهید تا اعتبار شما را بدون ورودی فوری شما بازیابی کند.

ارائه اعتبار ماژول خصوصی برای HTTPS

یکی از راه‌هایی که می‌توانید به Git بگویید چگونه از طرف شما وارد شوید، فایل netrc است. فایل netrc. که در فهرست اصلی کاربر قرار دارد، حاوی نام‌های میزبان مختلف و همچنین اعتبارنامه‌های ورود به سیستم برای آن میزبان است. این به طور گسترده توسط تعدادی ابزار از جمله Git استفاده می شود.

به طور پیش‌فرض، وقتی go get تلاش می‌کند یک ماژول را دانلود کند، ابتدا سعی می‌کند از HTTPS استفاده کند. با این حال، همانطور که در مثال قبلی نشان داده شد، نمی‌تواند از شما نام کاربری و رمز عبور را بخواهد. برای دادن اعتبار به Git، باید یک netrc. داشته باشید که شامل github.com در فهرست اصلی خود است.

برای ایجاد یک فایل netrc. در Linux، MacOS، یا Windows Subsystem for Linux (WSL)، فایل netrc. را در فهرست اصلی خود (~/) باز کنید تا بتوانید آن را ویرایش کنید:

nano ~/.netrc

بعد، یک ورودی جدید در فایل ایجاد کنید. مقدار ماشین باید نام میزبانی باشد که اعتبارنامه را برای آن تنظیم می کنید، که در این مورد github.com است. سپس مقدار ورود باید نام کاربری GitHub شما باشد. در نهایت، مقدار رمز عبور باید نشانه دسترسی شخصی GitHub باشد که ایجاد کرده‌اید.

~/.netrc

machine github.com
login your_github_username
password your_github_access_token

در صورت تمایل، می توانید کل ورودی را نیز در یک خط در فایل قرار دهید:

~/.netrc

machine github.com login your_github_username password your_github_access_token

اکنون محیط شما برای استفاده از احراز هویت HTTPS برای دانلود ماژول خصوصی شما تنظیم شده است. حتی اگر HTTPS روش پیش‌فرض Go و Git برای دانلود یک ماژول است، می‌توان به Git گفت که به جای آن از SSH استفاده کند. استفاده از SSH به جای HTTPS می تواند مفید باشد، بنابراین می توانید از همان کلید SSH که برای فشار دادن ماژول خصوصی خود استفاده می کردید استفاده کنید. همچنین به شما این امکان را می دهد که از کلیدهای استقرار هنگام تنظیم یک محیط CI/CD استفاده کنید، اگر ترجیح می دهید رمز دسترسی شخصی ایجاد نکنید.

ارائه اعتبار ماژول خصوصی برای SSH

برای استفاده از کلید SSH به عنوان روش احراز هویت برای ماژول Go خصوصی به جای HTTPS، Git یک گزینه پیکربندی به نام جایگزینOf را ارائه می دهد. گزینه جایگزین به شما این امکان را می دهد که بگویید “به جای” از https://github.com/ به عنوان URL درخواست برای همه درخواست های Git، ترجیح می دهید از ssh://git@github.com/ استفاده کنید.

در لینوکس، MacOS و WSL این پیکربندی در فایل gitconfig. وجود دارد. ممکن است قبلاً با این فایل آشنایی داشته باشید زیرا آدرس ایمیل و نام commit شما نیز در آن پیکربندی شده است. برای ویرایش فایل، از nano یا ویرایشگر متن مورد علاقه خود استفاده کنید و فایل ~/.gitconfig را در فهرست اصلی خود باز کنید:

nano ~/.gitconfig

هنگامی که فایل را باز کردید، آن را ویرایش کنید تا بخش url برای ssh://git@github.com/ مانند مثال زیر باشد:

~/.gitconfig

[user]
    email = your_github_username@example.com
    name = Sammy the Shark

[url "ssh://git@github.com/"]
    insteadOf = https://github.com/

ترتیب قسمت url نسبت به بخش کاربر اهمیتی ندارد و همچنین لازم نیست نگران باشید اگر هیچ چیز دیگری در فایل به جز قسمت url که به تازگی اضافه کرده اید وجود ندارد. ترتیب فیلدهای ایمیل و نام در قسمت کاربری نیز مهم نیست.

این بخش جدید به Git می‌گوید که هر نشانی اینترنتی که با https://github.com/ شروع می‌شود باید با ssh://git@github.com/ جایگزین شود. از آنجایی که Go به طور پیش فرض از HTTPS استفاده می کند، این امر بر دستورات go get شما نیز تأثیر می گذارد. با استفاده از ماژول خصوصی خود به عنوان مثال، این بدان معناست که Go مسیر واردات github.com/your_github_username/mysecret را به URL https://github.com/your_github_username/mysecret تبدیل می کند. هنگامی که Git با این URL روبرو می شود، URL را با پیشوند https://github.com/ مطابقت می بیند که به جای آن به آن ارجاع داده شده است و URL حاصل را به ssh://git@github.com/your_github_username/mysecret تبدیل می کند.

تا زمانی که URL ssh://git@ برای آن میزبان نیز کار کند، می‌توان از این الگو برای دامنه‌هایی غیر از GitHub استفاده کرد.

در این بخش، Git را برای استفاده از SSH برای دانلود ماژول های Go با به روز رسانی فایل .gitconfig و افزودن یک بخش url پیکربندی کردید. اکنون که احراز هویت برای ماژول خصوصی شما تنظیم شده است، می توانید برای استفاده در برنامه های Go خود به آن دسترسی داشته باشید.

استفاده از ماژول خصوصی

در بخش‌های قبلی، Go را برای دسترسی به ماژول Go خصوصی خود از طریق HTTPS، SSH یا احتمالاً هر دو پیکربندی کردید. اکنون که Go می تواند به ماژول خصوصی شما دسترسی داشته باشد، می توان از آن مشابه هر ماژول عمومی که در گذشته استفاده کرده اید استفاده کرد. در این بخش، یک ماژول Go جدید ایجاد می کنید که از ماژول خصوصی شما استفاده می کند.

در دایرکتوری که برای پروژه های خود استفاده می کنید، مانند پروژه ها، با استفاده از دستور mkdir یک دایرکتوری به نام myproject برای پروژه جدید ایجاد کنید:

mkdir myproject

پس از ایجاد دایرکتوری، با استفاده از cd به دایرکتوری بروید و یک ماژول Go جدید را با استفاده از go mod init برای پروژه خود بر اساس URL مخزنی که پروژه شما در آن زندگی می کند، راه اندازی کنید، مانند github.com/your_github_username/myproject. اگر قصد ندارید پروژه شما به مخزن دیگری منتقل شود، نام ماژول می تواند فقط myproject یا هر نام دیگری باشد، اما استفاده از URL های کامل تمرین خوبی است زیرا اکثر ماژول هایی که به اشتراک گذاشته می شوند به آنها نیاز دارند.

cd myproject
go mod init github.com/your_github_username/myproject

 

Output

go: creating new go.mod: module github.com/your_github_username/myproject

اکنون، با باز کردن main.go با nano یا ویرایشگر متن دلخواه خود، اولین فایل کد پروژه خود را ایجاد کنید:

nano main.go

در داخل فایل، تابع اصلی اولیه را که ماژول خصوصی خود را از آن فراخوانی می کنید، تنظیم کنید:

projects/myproject/main.go

package main

import "fmt"

func main() {
    fmt.Println("My new project!")
}

برای اجرای پروژه خود و اطمینان از اینکه همه چیز به درستی تنظیم شده است، می توانید از دستور go run استفاده کنید و فایل main.go را در اختیار آن قرار دهید:

go run main.go

 

Output

My new project!

در مرحله بعد، ماژول خصوصی خود را به عنوان وابستگی پروژه جدید خود با استفاده از go get اضافه کنید، مشابه آنچه برای یک ماژول عمومی انجام می دهید:

go get github.com/your_github_username/mysecret

سپس ابزار go کد ماژول خصوصی شما را دانلود کرده و با استفاده از یک رشته نسخه که با آخرین هش commit و زمان آن commit مطابقت دارد، آن را به عنوان یک وابستگی اضافه می کند:

 

Output

go: downloading github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2
go get: added github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2

در نهایت، فایل main.go را دوباره باز کنید و آن را به روز کنید تا یک تماس به تابع SecretProcess ماژول خصوصی خود در تابع اصلی اضافه کنید. همچنین باید عبارت import را به‌روزرسانی کنید تا github.com/your_github_username/mysecret خصوصی ماژول خود را نیز به‌عنوان یک import اضافه کنید:

projects/myproject/main.go

package main

import (
    "fmt"

    "github.com/your_github_username/mysecret"
)

func main() {
    fmt.Println("My new project!")
    mysecret.SecretProcess()
}

برای مشاهده پروژه نهایی در حال اجرا با ماژول خصوصی خود، از دستور go run دوباره استفاده کنید و فایل main.go را به عنوان پارامتر ارائه دهید:

go run main.go

پروژه جدید من را خواهید دید! خط از کد اصلی، اما اکنون یک فرآیند مخفی در حال اجرا را نیز خواهید دید! خط از ماژول mysecret وارد شده شما نیز:

 

Output

My new project!
Running the secret process!

در این بخش از go init برای ایجاد یک ماژول Go جدید برای دسترسی به ماژول خصوصی که قبلا منتشر کرده بودید استفاده کردید. هنگامی که ماژول را ایجاد کردید، سپس از go get برای دانلود ماژول خصوصی خود مانند یک ماژول عمومی Go استفاده کردید. در نهایت از go run برای کامپایل و اجرای برنامه Go خود با استفاده از ماژول خصوصی استفاده کردید.

نتیجه

در این آموزش، شما یک ماژول Go خصوصی ایجاد و منتشر کردید. همچنین برای دسترسی به ماژول Go خصوصی خود، احراز هویت HTTPS و SSH را تنظیم کرده اید. در نهایت، شما از ماژول خصوصی خود در یک پروژه جدید استفاده کردید.

برای اطلاعات بیشتر در مورد ماژول‌های Go، پروژه Go مجموعه‌ای از پست‌های وبلاگ دارد که نحوه تعامل و درک ابزارهای Go با ماژول‌ها را شرح می‌دهد. پروژه Go همچنین دارای یک مرجع بسیار دقیق و فنی برای ماژول های Go در مرجع Go Modules است.

علاوه بر متغیر محیطی GOPRIVATE، متغیرهای بیشتری برای استفاده در هنگام کار با ماژول های خصوصی Go در دسترس هستند. آنها را می توان با جزئیات در بخش Private Modules در مرجع Go Modules مشاهده کرد.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:HTTPSSSHاستفاده از ماژول خصوصی Goخرید سرورسرور مجازیفروش سرور مجازیماژول Goماژول خصوصی

  • behnam gol mohamadi