یکی از آشناترین مشکلات برای برنامه‌نویس‌ها این جمله است:
«ولی روی سیستم من اجرا می‌شود!»

 

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

تفاوت در نسخه زبان برنامه‌نویسی، کتابخانه‌ها، سیستم‌عامل، تنظیمات محیط توسعه، متغیرهای محیطی، مسیر فایل‌ها، وابستگی‌های پروژه و حتی نسخه دیتابیس می‌تواند باعث شود یک برنامه روی یک سیستم به‌درستی اجرا شود و روی سیستم دیگر با خطا مواجه شود.

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

محیط اجرا و دلایل اهمیت آن

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

برای مثال، فرض کنید یک پروژه با Python نوشته‌اید. اجرای این پروژه ممکن است به نسخه خاصی از Python، چند کتابخانه جانبی، یک فایل تنظیمات و حتی نسخه مشخصی از سیستم‌عامل وابسته باشد.

بنابراین چیزی که شما روی سیستم خودتان اجرا می‌کنید فقط «کد» نیست؛ بلکه ترکیبی از کد، وابستگی‌ها، تنظیمات و محیط اجرا است.

اگر یکی از این موارد روی سیستم دیگر متفاوت باشد، احتمال بروز خطا وجود دارد.

۱. تفاوت نسخه زبان برنامه‌نویسی

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

فرض کنید پروژه شما با Python 3.12 توسعه داده شده است، اما سیستم هم‌تیمی شما Python 3.8 دارد. ممکن است بخشی از کد یا یکی از قابلیت‌های استفاده‌شده در پروژه در نسخه قدیمی‌تر وجود نداشته باشد.

همین اتفاق در زبان‌ها و محیط‌های مختلف نیز رخ می‌دهد.

برای مثال:

  • Python
  • Node.js
  • PHP
  • Java
  • .NET
  • JavaScript Runtime

در پروژه‌های واقعی بهتر است نسخه مورد نیاز محیط اجرا مشخص باشد تا تمام اعضای تیم از شرایط مشابه استفاده کنند.

برای بررسی نسخه Python می‌توانید از دستور زیر استفاده کنید:

python --version

برای Node.js:

node --version

و برای PHP:

php -v

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

۲. نصب نبودن کتابخانه‌ها و وابستگی‌های پروژه

بسیاری از پروژه‌های برنامه‌نویسی فقط به امکانات پیش‌فرض زبان وابسته نیستند و از کتابخانه‌های مختلف استفاده می‌کنند.

برای مثال، ممکن است یک پروژه Python به کتابخانه‌هایی مانند Django، Flask یا Requests وابسته باشد.

اگر این کتابخانه‌ها روی سیستم دوم نصب نشده باشند، برنامه احتمالاً اجرا نخواهد شد.

این مشکل یکی از دلایلی است که مدیریت Dependency در پروژه‌های نرم‌افزاری اهمیت زیادی دارد.

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

برای مثال، در Python معمولاً از فایل requirements.txt استفاده می‌شود.

در پروژه‌های Node.js نیز فایل package.json نقش مهمی در مشخص کردن وابستگی‌های پروژه دارد.

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

۳. تفاوت سیستم‌عامل

گاهی مشکل از نسخه زبان یا کتابخانه نیست؛ بلکه تفاوت سیستم‌عامل باعث ایجاد خطا می‌شود.

برای مثال، پروژه‌ای که روی Windows توسعه داده شده ممکن است روی Linux یا macOS رفتار متفاوتی داشته باشد.

یکی از نمونه‌های رایج، تفاوت نحوه نوشتن مسیر فایل‌ها است.

در Windows معمولاً مسیرها با Backslash نوشته می‌شوند:

C:\project\images\logo.png

در سیستم‌های Unix-based مانند Linux و macOS معمولاً از Slash استفاده می‌شود:

/project/images/logo.png

اگر مسیر فایل‌ها به شکل نادرست و وابسته به یک سیستم‌عامل خاص نوشته شده باشد، ممکن است پروژه روی سیستم دیگری نتواند فایل مورد نظر را پیدا کند.

به همین دلیل در پروژه‌های حرفه‌ای باید تا حد امکان از روش‌های استاندارد و مستقل از سیستم‌عامل برای مدیریت مسیرها استفاده شود.

۴. مشکل Environment Variable

گاهی اطلاعات مهم پروژه مستقیماً داخل کد قرار نمی‌گیرند و از طریق Environment Variable در اختیار برنامه قرار می‌گیرند.

برای مثال:

  • DATABASE_URL
  • API_KEY
  • SECRET_KEY
  • PORT

ممکن است این متغیرها روی سیستم شما تنظیم شده باشند، اما روی سیستم دوستتان وجود نداشته باشند.

در چنین شرایطی برنامه هنگام اجرا نمی‌تواند اطلاعات مورد نیاز خود را پیدا کند و ممکن است با خطا مواجه شود.

یکی از روش‌های رایج در پروژه‌های مدرن، استفاده از فایل .env برای نگهداری تنظیمات محیطی است.

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

۵. تفاوت تنظیمات محیط توسعه

ممکن است دو نفر از یک کد کاملاً یکسان استفاده کنند، اما تنظیمات IDE یا محیط توسعه آن‌ها متفاوت باشد.

برای مثال:

  • نسخه متفاوت Visual Studio Code
  • تنظیمات متفاوت PHP
  • نسخه متفاوت XAMPP
  • تنظیمات متفاوت Compiler
  • نسخه متفاوت Extensionها
  • تنظیمات متفاوت Terminal
  • متفاوت بودن PATH سیستم

همه این موارد می‌توانند روی نحوه اجرای برنامه تأثیر بگذارند.

به همین دلیل در پروژه‌های تیمی بهتر است مشخصات محیط توسعه و روش راه‌اندازی پروژه مستند شوند.

۶. نصب نبودن ابزارهای مورد نیاز

گاهی اوقات پروژه برای اجرا به ابزارهایی نیاز دارد که روی سیستم دوم نصب نشده‌اند.

برای مثال، یک پروژه ممکن است به موارد زیر نیاز داشته باشد:

  • Git
  • Node.js
  • PHP
  • Composer
  • Python
  • Java
  • Docker
  • MySQL
  • PostgreSQL

اگر یکی از این ابزارها وجود نداشته باشد یا به‌درستی در PATH سیستم قرار نگرفته باشد، اجرای پروژه ممکن است با خطا مواجه شود.

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

در حالی که یک پروژه واقعی معمولاً به یک فرآیند Setup نیاز دارد.

۷. تفاوت نسخه دیتابیس

اگر پروژه شما به دیتابیس متصل باشد، مسئله پیچیده‌تر می‌شود.

ممکن است شما از MySQL یا PostgreSQL با نسخه مشخصی استفاده کنید، اما روی سیستم دیگر نسخه متفاوتی نصب شده باشد.

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

در چنین شرایطی برنامه هنگام اجرای Query ممکن است با خطا مواجه شود.

به همین دلیل در پروژه‌های حرفه‌ای معمولاً ساختار دیتابیس، Migrationها یا روش ایجاد Database نیز همراه پروژه مدیریت می‌شوند.

۸. فایل‌ها و مسیرهای Hard-coded شده

یکی دیگر از مشکلات رایج، قرار دادن مسیرهای ثابت در کد است.

برای مثال:

C:\Users\Ali\Desktop\project\data.txt

این مسیر فقط روی سیستمی که چنین ساختاری دارد ممکن است معتبر باشد.

وقتی پروژه به سیستم دیگری منتقل می‌شود، احتمالاً چنین مسیری وجود ندارد.

راهکار بهتر این است که مسیرها به‌صورت قابل انتقال و مستقل از محیط ساخته شوند.

۹. تفاوت در Line Ending فایل‌ها

ممکن است این موضوع در نگاه اول کوچک به نظر برسد، اما در بعضی پروژه‌ها تفاوت Line Ending بین سیستم‌عامل‌ها می‌تواند باعث ایجاد مشکلاتی شود.

Windows و سیستم‌های Unix-based در نحوه ذخیره پایان خطوط فایل‌های متنی تفاوت‌هایی دارند.

در پروژه‌های تیمی، ابزارهایی مانند Git می‌توانند به مدیریت این تفاوت‌ها کمک کنند.

۱۰. مشکل Dependency Version

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

فرض کنید شما از نسخه ۲ یک کتابخانه استفاده می‌کنید، اما روی سیستم دوستتان نسخه ۱ نصب شده است.

ممکن است API یا رفتار بعضی از توابع بین این نسخه‌ها تغییر کرده باشد.

در نتیجه، برنامه‌ای که روی سیستم شما بدون مشکل اجرا می‌شود، روی سیستم دیگر خطا می‌دهد.

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

چطور بفهمیم مشکل دقیقاً از کجاست؟

وقتی برنامه روی سیستم شما اجرا می‌شود اما روی سیستم دیگری نه، نباید بلافاصله شروع به تغییر دادن کد کنید.

ابتدا باید محیط دو سیستم را با یکدیگر مقایسه کنید.

این موارد را بررسی کنید:

  • نسخه زبان برنامه‌نویسی یکسان است؟
  • کتابخانه‌های مورد نیاز نصب هستند؟
  • نسخه کتابخانه‌ها یکسان است؟
  • سیستم‌عامل‌ها چه تفاوتی دارند؟
  • Environment Variableها تنظیم شده‌اند؟
  • دیتابیس ساخته شده است؟
  • نسخه دیتابیس یکسان است؟
  • ابزارهای مورد نیاز نصب هستند؟
  • مسیر فایل‌ها صحیح است؟
  • متن کامل خطا چیست؟
  • Stack Trace چه اطلاعاتی ارائه می‌دهد؟

همین بررسی ساده در بسیاری از مواقع می‌تواند مسیر پیدا کردن مشکل را مشخص کند.

چطور پروژه‌ای بسازیم که روی سیستم‌های مختلف راحت‌تر اجرا شود؟

برای جلوگیری از این مشکل بهتر است از همان ابتدای پروژه چند اصل را رعایت کنیم.

  • اول اینکه نسخه ابزارهای اصلی پروژه را مشخص کنیم.
  • دوم اینکه وابستگی‌های پروژه را در فایل‌های استاندارد مدیریت کنیم.
  • سوم اینکه اطلاعات حساس و تنظیمات محیطی را از کد اصلی جدا کنیم.
  • چهارم اینکه یک فایل README برای توضیح نحوه نصب و اجرای پروژه داشته باشیم.

در README بهتر است مواردی مانند نسخه مورد نیاز زبان، نحوه نصب Dependencies، نحوه تنظیم Environment Variableها، ایجاد دیتابیس و دستور اجرای پروژه نوشته شود.

در پروژه‌های بزرگ‌تر نیز استفاده از Docker می‌تواند به ایجاد محیط اجرای قابل تکرار کمک کند.

Docker چه کمکی می‌کند؟

یکی از راهکارهای محبوب برای کاهش اختلاف محیط اجرا، استفاده از Docker است.

Docker به توسعه‌دهنده اجازه می‌دهد برنامه و بخش زیادی از محیط مورد نیاز آن را در قالب Container اجرا کند.

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

این موضوع مخصوصاً در پروژه‌های تیمی، Backend، سرورها و فرآیندهای Deployment اهمیت زیادی دارد.

البته Docker تمام مشکلات سازگاری را به‌صورت جادویی حل نمی‌کند، اما می‌تواند تفاوت‌های محیط اجرا را تا حد زیادی کنترل‌پذیرتر کند.

یک مثال واقعی

فرض کنید یک پروژه Node.js دارید.

روی سیستم شما:

  • Node.js نسخه 22 نصب است.
  • تمام Dependencies نصب هستند.
  • فایل .env وجود دارد.
  • MySQL روی سیستم فعال است.
  • Database ساخته شده است.

اما روی سیستم دوستتان:

  • Node.js نسخه 18 نصب است.
  • برخی Dependencies نصب نشده‌اند.
  • فایل .env وجود ندارد.
  • MySQL اجرا نمی‌شود.
  • Database ساخته نشده است.

در این حالت، اگر پروژه روی سیستم شما اجرا شود و روی سیستم دوستتان اجرا نشود، به این معنی نیست که کد شما الزاماً مشکل دارد.

محیط اجرای دو پروژه متفاوت است.

بنابراین اولین کار، مقایسه Environment است؛ نه تغییر تصادفی کد.

چک‌لیست سریع برای حل مشکل

اگر با جمله «روی سیستم من اجرا می‌شود» مواجه شدید، این چک‌لیست را دنبال کنید:

  1. نسخه زبان برنامه‌نویسی را بررسی کنید.
  2. نسخه کتابخانه‌ها و Dependencies را بررسی کنید.
  3. فایل‌های تنظیمات پروژه را بررسی کنید.
  4. Environment Variableها را بررسی کنید.
  5. مسیر فایل‌ها را بررسی کنید.
  6. وضعیت دیتابیس را بررسی کنید.
  7. ابزارهای مورد نیاز پروژه را بررسی کنید.
  8. متن کامل Error را بخوانید.
  9. Stack Trace را بررسی کنید.
  10. مراحل نصب و اجرای پروژه را با README مقایسه کنید.
  11. در صورت نیاز، محیط اجرا را با Docker یکسان‌سازی کنید.

جمع‌بندی

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

در بسیاری از موارد، مشکل از تفاوت محیط اجرا، نسخه زبان برنامه‌نویسی، Dependencies، سیستم‌عامل، تنظیمات Environment، دیتابیس یا مسیر فایل‌ها ناشی می‌شود.

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

اگر پروژه‌ای قرار است بین چند سیستم یا چند برنامه‌نویس جابه‌جا شود، بهتر است از همان ابتدا نسخه‌ها و Dependencies مشخص باشند، تنظیمات محیطی مستند شوند و یک راهنمای واضح برای نصب و اجرای پروژه وجود داشته باشد.

در نهایت، دفعه بعد که کدی روی سیستم شما اجرا شد اما روی سیستم دوستتان اجرا نشد، به جای اینکه سریع بگویید «برای من که کار می‌کنه!»، اول Environment را بررسی کنید؛ احتمالاً مشکل از همین‌جاست.