فا نیکسی

autoPatchcilHook

این یک قلاب راه‌اندازی (setup hook) ویژه است که به بسته‌بندی برنامه‌ها/اسمبلی‌های .NET کمک می‌کند؛ به این صورت که به‌طور خودکار تلاش می‌کند وابستگی‌های کتابخانه‌ای اشتراکیِ مفقودشده‌ی اسمبلی‌های .NET را بر اساس buildInputs و nativeBuildInputs داده‌شده پیدا کند.

از آنجا که این قلاب به اطلاعات میزبان (host) محل اجرای بسته نیاز دارد، یک متغیر محیطی الزامی به نام autoPatchcilRuntimeId وجود دارد که باید با RID (شناسه زمان اجرا یا Runtime Identifier) ماشینی که خروجی روی آن اجرا خواهد شد، مقداردهی شود. اگر از buildDotnetModule استفاده می‌کنید، در صورت عدم ارائه این متغیر، به‌طور خودکار به dotnetRuntimeIds (که برابر با lib.singleton (if runtimeId != null then runtimeId else systemToDotnetRid stdenvNoCC.hostPlatform.system) تنظیم شده است) بازمی‌گردد.

در شرایط خاص ممکن است بخواهید دستور اصلی قلاب راه‌اندازی (autoPatchcil) را روی یک فایل یا مجموعه‌ای از پوشه‌ها اجرا کنید، به‌جای اینکه بدون قید و شرط تمام خروجی‌ها را پچ کنید. این کار را می‌توان با مقداردهی متغیر محیطی dontAutoPatchcil با یک مقدار غیرخالی انجام داد.

به‌طور پیش‌فرض، اگر هر یک از اسمبلی‌های .NET به وابستگی نیاز داشته باشد که از طریق ورودی‌های ساخت داده‌شده قابل حل نباشد، autoPatchcil بلافاصله با خطا مواجه می‌شود. در برخی شرایط ممکن است ترجیح دهید وابستگی‌های مفقودشده را بدون پچ کردن رها کرده و به پچ کردن مابقی ادامه دهید. این کار با تنظیم متغیر محیطی autoPatchcilIgnoreMissingDeps روی یک مقدار غیرخالی امکان‌پذیر است. autoPatchcilIgnoreMissingDeps را می‌توان روی لیستی مانند autoPatchcilIgnoreMissingDeps = [ "libcuda.so.1" "libcudart.so.1" ]; یا [ "*" ] تنظیم کرد تا تمام وابستگی‌های مفقودشده نادیده گرفته شوند.

دستور autoPatchcil به پرچم خط فرمان --rid نیاز دارد تا RID (شناسه‌ی زمان اجرا) فرضی برای اجرای اسمبلی‌ها را مشخص کند، و همچنین پرچم خط فرمان --no-recurse را می‌شناسد که از پیمایش بازگشتی درون زیرپوشه‌ها جلوگیری می‌کند.

نکته

از آنجا که برخلاف بیشتر باینری‌های بومی (native)، اسمبلی‌های .NET یک بار کامپایل می‌شوند تا روی هر پلتفرمی اجرا شوند، بسیاری از اسمبلی‌ها ممکن است دارای استاب‌های (stubs) PInvoke برای کتابخانه‌هایی باشند که شاید در پلتفرم مقصد اجرا برای بسته در دسترس نباشند. چند نمونه از این دست، اسمبلی‌هایی هستند که APIهای بومی Windows را از طریق PInvoke با هدف قرار دادن kernel32، gdi32، user32، shell32 یا ntdll فراخوانی می‌کنند.

autoPatchcil تمام تلاش خود را می‌کند تا با بررسی پسوند فایل‌های درخواستی، وابستگی‌های مربوط به پلتفرم‌های دیگر را نادیده بگیرد؛ با این حال همه استاب‌های PInvoke پسوند ارائه نمی‌دهند، بنابراین در این موارد لازم است آن‌ها را به‌طور دستی در autoPatchcilIgnoreMissingDeps فهرست کنید.