كابال لا يقوم بتثبيت التبعيات عند الحاجة إلى مكتبات التوصيف؟
سؤال
أريد أن تجميع برنامجي مع التنميط، لذلك أركض:
$ cabal configure --enable-executable-profiling
...
$ cabal build
...
Could not find module 'Graphics.UI.GLUT':
Perhaps you havent installed the profiling libraries for package 'GLUT-2.2.2.0'?
...
$ # indeed I have not installed the prof libs for GLUT, so..
$ cabal install -p GLUT --reinstall
...
Could not find module 'Graphics.Rendering.OpenGL':
Perhaps you havent installed the profiling libraries for package 'OpenGL-2.4.0.1'?
...
لذلك، المشكلة هي أنه على عكس سلوك الترحيب المعتاد في Cabal، لا يحل Cabal التبعيات وتثبيتها عند حاجة إلى مكتبات التنميط.
يمكنني العمل من حوله عن طريق حل التبعيات يدويا (باتباع الأخطاء التي تظهر بعد فترة من الوقت):
$ cabal install -p OpenGLRaw --reinstall
$ cabal install -p StateVar --reinstall
$ cabal install -p Tensor --reinstall
$ cabal install -p ObjectName --reinstall
$ cabal install -p GLURaw --reinstall
$ cabal install -p OpenGL --reinstall
$ cabal install -p GLUT --reinstall
ثم كرر التبعية التالية ..
هل هناك طريقة أفضل للقيام بذلك؟ أي جعل كابال تفعل العمل بمفرده كما يفعل للمكتبات العادية؟
المحلول
لقد مكنت library-profiling: True
في ~/.cabal/config
ملف. من ذلك الحين، ستقوم أي منشآت جديدة تلقائيا بتمكين التنميط.
لسوء الحظ، لا تزال تعني أنه اضطررت إلى إعادة تثبيت الحزم القديمة يدويا بالفعل. على الرغم من، بعد فترة من القيام بذلك يدويا، أنا الآن لديك معظم الحزم إعادة تثبيتها مع تمكين التنميط ...
نصائح أخرى
من تعليق توم لوكورست:
آمل أن يأتي شخص ما إلى جنبا إلى جنب مع إجابة أفضل، واحدة لا تتطلب مني إعادة تثبيت منصة Haskell كاملة يدويا في المرة القادمة.
للزوار في المستقبل:
أصبحت مهمة تثبيت إصدارات التنميط من جميع المكتبات المثبتة أقل من Chore، cabal (cabal-install)
تتبع الآن ما تم تثبيته باستخدامه في world
ملف في .cabal
الدليل (على لينكس، سيكون ذلك $HOME/.cabal
, ، على ويندوز شيء مثل C:\Users\%YOU%\AppData\Roaming\cabal\
, ، على OSX ؟؟).
لذلك بعد تمكين التنميط في config
ملف (في نفس الدليل)، وإزالة قاعدة بيانات حزمة GHC (يمكنك العثور على مواقع DB العالمية والمستخدم لكل ghc-pkg list nonexisting
; ؛ قم بإزالة الحزم المثبتة في Cabal من قاعدة البيانات العالمية ghc-pkg unregister packagename
إذا كان لديك أي أو إعادة تسمية أو حذف المستخدم بأكمله DB - هذا ضروري لأن world
يتتبع الملف فقط الحزم المثبتة بشكل صريح، وليس تبعياتها)، في تثبيت كل شيء مع دعم التنميط يجب أن تعمل على النحو التالي:
$ cabal install --reinstall world --dry-run
الجري أولا مع --dry-run
للتحقق من وجود مشاكل قبل إعادة تثبيت أي شيء. إذا كان سيتم إعادة تثبيت حزم التمهيد مثل process
أو directory
, هذه علامة سيئة، إذا كنت لا تعرف كيفية التعامل معها، اسأل عن #haskell
قناة IRC، واحدة من القوائم البريدية، أو هنا للحصول على إرشادات. إذا فشل في العثور على خطة تثبيت ثابتة بسبب الإصدارات الجديدة قراصنة من بعض الحزم التي لا تتفق مع بعضها البعض، والتي يمكن حلها عادة عن طريق تحرير world
ملف وقيادة الإصدارات المسموح بها من بعض الحزم.
ثم، إذا كنت متفائلا أن لا شيء سوف يكسر بشكل سيء،
$ cabal install --reinstall world
ولديك وعاء لطيف من الشاي بينما GGC مشغول تجميع.
يبدو إجابة دانيال فيشر جيدة، ولكن لسبب ما مكتبة ~ / .cabal / world موجودة فقط إدخالات للمكتبات المثبتة مباشرة، وليس تبعياتها.
بدلا من ذلك، قمت بإلقاء قائمة بجميع المكتبات المثبتة باستخدام
$ ghc-pkg list > list
هذا يسرد المكتبات المثبتة على مستوى النظام ومحليا. لذلك، قمت بتحرير list
ملف لإزالة الجزء الأول (يحتوي على المكتبات المثبتة على نطاق النظام) ترك الخطوط فقط بعد /home/<user>/.ghc/...
. وبعد أخيرا، ركضت
$ cabal install --reinstall $(cat list)
هذا عملت بالنسبة لي. يجب أن تفعل ربما --dry-run
أول. ثم اذهب جعل وعاء من الشاي. أو خبز كعكة.
للزوار 2016+: مجرد تثبيت ghc-prof
أنظمة ديبيان لينكس:
sudo apt-get install ghc-prof
أنظمة Linux Arch:
sudo pacman -S ghc-prof