0Pricing
R Academy · درس

إرسال الحزم إلى CRAN وصيانتها

شغّل R CMD check، وحلّ مشكلات NOTE وWARNING، وأرسل الحزمة إلى CRAN

إرسال الحزم إلى CRAN وصيانتها درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

عملية إرسال الحزمة إلى CRAN

CRAN (Comprehensive R Archive Network) هو المستودع الرسمي لحزم R. يتطلب إرسال الحزمة اجتياز الفحوصات الآلية والمراجعة البشرية وفقًا لسياسات صارمة. وتتم العملية كالتالي: التحضير ← الفحص ← الإنشاء ← الإرسال ← التعديل بناءً على الملاحظات.

devtools::check() — صفر من الأخطاء والتحذيرات

قبل الإرسال، يجب أن ينتج عن devtools::check() عدد 0 من ERRORs و0 من WARNINGs. يُسمح برسائل NOTE، لكن ينبغي تقليلها إلى أدنى حد. ومن المشكلات الشائعة التي يكتشفها الفحص:

  • دوال أو وسائط غير موثقة
  • استيرادات حزم مفقودة في DESCRIPTION
  • أمثلة تتسبب في أخطاء أو تستغرق وقتًا طويلًا
  • استخدام متغيرات عامة (استخدم utils::globalVariables())
# devtools::check()  # or Ctrl+Shift+E
#
# Target output:
# -- R CMD check results -------------------------
# Duration: 45.3s
# 0 errors v | 0 warnings v | 1 note x
# NOTE: New submission.
#
# 'New submission' is an expected NOTE for first-time packages.
# All actual ERRORs and WARNINGs must be fixed before submitting.

سياسات CRAN — القواعد الأساسية

تطبّق CRAN سياسات صارمة. وهذه أكثر القواعد التي يحدث انتهاكها شيوعًا:

  • يُمنع الوصول إلى الإنترنت في الأمثلة أو الاختبارات أو المستندات التوضيحية إلا إذا كان ذلك مشروطًا بتوفّره
  • يجب أن يقل إجمالي وقت تشغيل الأمثلة عن 5 ثوانٍ — استخدم \dontrun{} أو \donttest{} للأمثلة البطيئة
  • يُمنع الكتابة في الدليل الرئيسي للمستخدم — استخدم tempdir() في الأمثلة
  • يُمنع استخدام المسارات الثابتة — استخدم المسارات النسبية أو tempdir() في جميع عمليات الملفات
# Correct: examples that write to tempdir
# #' @examples
# #' tmp <- tempfile()
# #' write.csv(mtcars, tmp)
# #' read.csv(tmp)
# #' unlink(tmp)
#
# Correct: skip slow or network examples
# #' @examples
# #' \dontrun{
# #'   # slow operation
# #'   fit_big_model(huge_dataset)
# #' }

devtools::build() — إنشاء حزمة التوزيع

ينشئ devtools::build() حزمة مصدر بتنسيق .tar.gz (مثل mypackage_0.1.0.tar.gz) مناسبة لإرسالها إلى CRAN. استخدم devtools::build(binary = TRUE) لإنشاء حزمة ثنائية لتوزيعها على نظام التشغيل المحلي.

# devtools::build()
# => mypackage_0.1.0.tar.gz
#
# What build does:
# 1. Runs devtools::document() to regenerate man/ and NAMESPACE
# 2. Compiles vignettes (if any)
# 3. Bundles R/, man/, DESCRIPTION, NAMESPACE, tests/ etc.
# 4. Excludes files listed in .Rbuildignore
#
# Inspect the bundle:
# tar -tzf mypackage_0.1.0.tar.gz | head -20

devtools::release() — الإرسال التفاعلي

يشغّل devtools::release() قائمة تحقق تفاعلية ترشدك خلال الفحوصات النهائية السابقة للإرسال، وتطلب منك تأكيد الالتزام بسياسات CRAN، ثم ترسل ملف .tar.gz إلى https://cran.r-project.org/submit.html باستخدام واجهة CRAN للويب.

# devtools::release()
#
# Interactive questions include:
# - Have you checked on R-devel?
# - Have you checked on Windows with win-builder?
# - Is there a single top-level .R file in tests/?
# - Have you removed donttest{} for essential examples?
# - Is the package correctly versioned?
#
# After answering, it submits and emails the CRAN team.

الفحص على منصات متعددة

تفحص CRAN الحزم على أنظمة تشغيل وإصدارات متعددة من R. أجرِ اختبارًا واسعًا قبل الإرسال:

  • devtools::check_win_devel() — الإرسال إلى win-builder (Windows، R-devel)
  • devtools::check_rhub() — الفحص على منصات Linux/Windows متعددة عبر R-hub
  • devtools::check_mac_release() — الفحص على macOS
# Check on Windows R-devel (submits to win-builder, results emailed):
# devtools::check_win_devel()
#
# Check on multiple platforms via R-hub:
# rhub::check_for_cran()   # requires rhub package and account
#
# Minimum: check locally + win-builder before every CRAN submission
cat('CRAN checks on Windows, macOS, and multiple Linux distros
')

NEWS.md — توثيق التغييرات

يوثّق NEWS.md التغييرات بين الإصدارات. وتتطلبه CRAN عند تحديث الحزم. نسّق كل إصدار باعتباره عنوانًا يتبعه تعداد نقطي يصف ما تغيّر. يقرأ المستخدمون ومراجعو CRAN هذا الملف لفهم التغييرات.

# NEWS.md format:
#
# # mypackage 0.2.0
# * Added subtract() function for element-wise subtraction.
# * add() now accepts complex numbers.
# * Fixed bug where add(NA, x) returned 0 instead of NA.
#
# # mypackage 0.1.0
# * Initial CRAN release.
# * Core add() function for numeric addition.
cat('usethis::use_news_md() creates NEWS.md with the right format
')

usethis::use_version() لرفع رقم الإصدار

تزيد usethis::use_version('minor') رقم الإصدار في DESCRIPTION، وتضيف عنوانًا مؤقتًا جديدًا في NEWS.md. استخدم الإصدار الدلالي: major.minor.patch.

# Version bump commands:
# usethis::use_version('patch')   # 0.1.0 -> 0.1.1  (bug fixes)
# usethis::use_version('minor')   # 0.1.0 -> 0.2.0  (new features)
# usethis::use_version('major')   # 0.1.0 -> 1.0.0  (breaking changes)
# usethis::use_version('dev')     # 0.1.0 -> 0.1.0.9000 (dev suffix)
#
# CRAN packages should NOT have a dev suffix (e.g., 0.9000)
# Dev suffix signals work-in-progress on GitHub between releases

GitHub Actions للتكامل المستمر

أتمت فحص R CMD check عند كل عملية push باستخدام r-lib/actions. تنشئ usethis::use_github_action('check-standard') سير عمل يفحص الحزمة على Ubuntu وmacOS وWindows عبر إصدارات متعددة من R.

# usethis::use_github_action('check-standard')
# Creates .github/workflows/R-CMD-check.yaml
#
# The workflow:
# - triggers on push and pull_request
# - runs on ubuntu-latest, macos-latest, windows-latest
# - tests on R release, R devel, and R oldrel
# - caches installed packages for faster runs
# - reports check results as GitHub status checks

التعامل مع ملاحظات مراجع CRAN

قد يطلب مراجعو CRAN إجراء تغييرات. ومن الطلبات الشائعة:

  • إحاطة الأمثلة طويلة التشغيل بـ \donttest{}
  • استخدام شروط الحماية if (interactive()) للدوال التي تفتح واجهات مستخدم
  • تصحيح الأخطاء الإملائية في التوثيق (استخدم usethis::use_spell_check())
  • إضافة رسائل خطأ أكثر وصفًا

استجب سريعًا وأعد الإرسال. ومن الطبيعي أن تمر المراجعة بجولات متعددة.

# Spell check DESCRIPTION and man/ pages:
# usethis::use_spell_check()
# spelling::spell_check_package()  # run the check
#
# Add words to WORDLIST to ignore false positives:
# spelling::update_wordlist()
#
# After making all changes:
# devtools::check()  # confirm 0 errors/warnings
# devtools::release()  # resubmit

صيانة الحزمة بعد الإصدار

بعد قبول الحزمة في CRAN، تشمل الصيانة المستمرة ما يلي:

  • مراقبة تحذيرات إهمال الدوال الصادرة عن التبعيات أثناء فحوصات R-devel
  • معالجة حالات فشل فحص CRAN خلال 14 يومًا (وفقًا لسياسة CRAN)
  • استخدام lifecycle::deprecate_warn() لإهمال الدوال القديمة تدريجيًا
  • إعداد usethis::use_github_action('pkgdown') لإنشاء موقع للتوثيق
# Mark a function as deprecated:
# library(lifecycle)
#
# old_add <- function(x, y) {
#   lifecycle::deprecate_warn('0.2.0', 'old_add()', 'add()')
#   add(x, y)
# }
#
# Users see: 'old_add()' was deprecated in mypackage 0.2.0.
# Please use 'add()' instead.

تحقق سريع: سياسة أمثلة CRAN

ما الوسم الذي ينبغي استخدامه لإدراج مثال طويل التشغيل في توثيقك من دون أن ينفذه الفاحص الآلي لدى CRAN؟

مراجعة إرسال الحزمة إلى CRAN وصيانتها

سير عمل إصدار الحزمة إلى CRAN:

  • devtools::check() — يلزم وجود 0 من ERRORs و0 من WARNINGs
  • سياسات CRAN: لا إنترنت في الأمثلة، ومدة الأمثلة أقل من 5 ثوانٍ، واستخدام tempdir() للكتابة
  • devtools::build() — ينشئ حزمة .tar.gz
  • devtools::release() — إرسال تفاعلي موجّه
  • فحوصات متعددة المنصات: check_win_devel() وR-hub
  • ملف NEWS.md بعناوين للإصدارات؛ ارفع الإصدار باستخدام use_version('minor')
  • استخدام GitHub Actions مع r-lib/actions للتكامل المستمر عند إجراء push
  • الرد على ملاحظات المراجعين خلال 14 يومًا

الأسئلة الشائعة

هل درس «إرسال الحزم إلى CRAN وصيانتها» مجاني؟

نعم — نص درس «إرسال الحزم إلى CRAN وصيانتها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «إرسال الحزم إلى CRAN وصيانتها»؟

شغّل R CMD check، وحلّ مشكلات NOTE وWARNING، وأرسل الحزمة إلى CRAN تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «إرسال الحزم إلى CRAN وصيانتها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. بنية الحزم باستخدام usethis وdevtools
  2. توثيق الدوال باستخدام roxygen2
  3. اختبار الوحدات باستخدام testthat
  4. إرسال الحزم إلى CRAN وصيانتها
← العودة إلى R Academy