ব্যবহার Clojure কোড পুনরায় লোড করা (require … :reload)
এবং :reload-all
হয় খুব সমস্যাযুক্ত :
যদি আপনি দুটি নেমস্পেসগুলি একে অপরের উপর নির্ভর করে পরিবর্তন করেন তবে সংকলন ত্রুটিগুলি এড়াতে আপনাকে অবশ্যই সঠিক ক্রমে পুনরায় লোড করতে হবে remember
আপনি যদি কোনও উত্স ফাইল থেকে সংজ্ঞাগুলি সরিয়ে থাকেন এবং তারপরে এটিকে পুনরায় লোড করেন তবে সেই সংজ্ঞাগুলি এখনও মেমরিতে উপলব্ধ। যদি অন্য কোডগুলি সেই সংজ্ঞাগুলির উপর নির্ভর করে তবে এটি কাজ চালিয়ে যাবে তবে পরের বার আপনি JVM পুনরায় চালু করবেন break
যদি পুনরায় লোড হওয়া নেমস্পেস থাকে তবে defmulti
আপনাকে অবশ্যই সম্পর্কিত সমস্ত defmethod
অভিব্যক্তি পুনরায় লোড করতে হবে ।
যদি পুনরায় লোড করা নেমস্পেস থাকে তবে defprotocol
আপনাকে অবশ্যই সেই রেকর্ড বা প্রোটোকলটি প্রয়োগকারী প্রকারগুলি পুনরায় লোড করতে হবে এবং সেই রেকর্ড / প্রকারের বিদ্যমান উপস্থিতিগুলিকে নতুন উদাহরণ সহ প্রতিস্থাপন করতে হবে।
যদি পুনরায় লোড হওয়া নেমস্পেসে ম্যাক্রোগুলি থাকে তবে আপনাকে অবশ্যই সেই জাতীয় ম্যাক্রোগুলি যে কোনও নেমস্পেসগুলি পুনরায় লোড করতে হবে।
যদি চলমান প্রোগ্রামটিতে এমন ফাংশন থাকে যা পুনরায় লোড হওয়া নেমস্পেসে মানগুলি বন্ধ করে দেয় তবে সেই ক্লোজড ওভার মানগুলি আপডেট হয় না। (এটি ওয়েব অ্যাপ্লিকেশনগুলিতে প্রচলিত যা ফাংশনগুলির রচনা হিসাবে "হ্যান্ডলার স্ট্যাক" তৈরি করে))
Clojure.tools.namespace গ্রন্থাগার পরিস্থিতি উল্লেখযোগ্যভাবে উন্নত করে। এটি একটি সহজ রিফ্রেশ ফাংশন সরবরাহ করে যা নামের স্থানগুলির নির্ভরতা গ্রাফের উপর ভিত্তি করে স্মার্ট পুনরায় লোড করে does
myapp.web=> (require '[clojure.tools.namespace.repl :refer [refresh]])
nil
myapp.web=> (refresh)
:reloading (myapp.web)
:ok
দুর্ভাগ্যক্রমে দ্বিতীয় বার পুনরায় লোড করা যদি আপনি refresh
ফাংশনটি উল্লেখ করেছেন সেই নেমস্পেসটি পরিবর্তন হয়ে যায়। এটি নতুন কোড লোড করার আগে সরঞ্জাম.নামস্পেস নামের জায়গার বর্তমান সংস্করণটিকে ধ্বংস করে দেয় এই কারণে এটি ঘটে।
myapp.web=> (refresh)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: refresh in this context, compiling:(/private/var/folders/ks/d6qbfg2s6l1bcg6ws_6bq4600000gn/T/form-init819543191440017519.clj:1:1)
আপনি এই সমস্যার জন্য সম্পূর্ণরূপে যোগ্যতাসম্পন্ন বর্ণ নামটি ব্যবহার করতে পারেন তবে ব্যক্তিগতভাবে আমি প্রতিটি রিফ্রেশে টাইপ না করা পছন্দ করি। উপরের সাথে আর একটি সমস্যা হ'ল মূল নামস্থানটি পুনরায় লোড করার পরে মানক আরপিএল সহায়ক ফাংশনগুলি (যেমন doc
এবং source
) আর রেফারেন্স করা হয় না।
এই সমস্যাগুলি সমাধান করার জন্য আমি ব্যবহারকারীর নেমস্পেসের জন্য একটি আসল উত্স ফাইল তৈরি করতে পছন্দ করি যাতে এটি নির্ভরযোগ্যভাবে পুনরায় লোড করা যায়। আমি উত্স ফাইলটি রেখেছি ~/.lein/src/user.clj
তবে আপনি যে কোনও জায়গায় রাখতে পারেন। এই ফাইলটির জন্য শীর্ষ এনএস ঘোষণায় রিফ্রেশ ফাংশন প্রয়োজন:
(ns user
(:require [clojure.tools.namespace.repl :refer [refresh]]))
আপনি সেটআপ একটি leiningen ব্যবহারকারী প্রোফাইল মধ্যে ~/.lein/profiles.clj
যাতে অবস্থান আপনি বর্গ পথ যোগ করা হয় ফাইল করা। প্রোফাইলটি দেখতে এমন কিছু দেখতে পাওয়া উচিত:
{:user {:dependencies [[org.clojure/tools.namespace "0.2.7"]]
:repl-options { :init-ns user }
:source-paths ["/Users/me/.lein/src"]}}
নোট করুন যে আমি আরপিএল চালু করার সময় ব্যবহারকারীর নাম স্থানটি এন্ট্রি পয়েন্ট হিসাবে সেট করেছি। এটি নিশ্চিত করে যে আরপিএল সহায়ক ফাংশনগুলি আপনার অ্যাপ্লিকেশনটির প্রধান নাম স্থানের পরিবর্তে ব্যবহারকারীর নামস্থানে রেফারেন্স পেতে পারে। আপনি সবে তৈরি করা উত্স ফাইলটি পরিবর্তন না করা পর্যন্ত সেগুলি হারাবে না।
আশাকরি এটা সাহায্য করবে!
(use 'foo.bar :reload-all)
সবসময় আমার জন্য ভাল কাজ করেছে। এছাড়াও,(load-file)
আপনার ক্লাসপথটি সঠিকভাবে স্থাপন করা থাকলে কখনই প্রয়োজন হবে না। আপনি "প্রয়োজনীয় প্রভাব" কী পাচ্ছেন না?