সাধারণ নেস্টেড সাব-মডিউলগুলির সাথে গিট সংগ্রহস্থলগুলি সংগঠিত করা হচ্ছে


50

আমি গিট সাব-মডিউলগুলির একটি বড় অনুরাগী । আমি এর সংস্করণ সহ একটি নির্ভরতাও ট্র্যাক করতে সক্ষম হতে চাই, যাতে আপনি আপনার প্রকল্পের পূর্ববর্তী সংস্করণে ফিরে যেতে পারেন এবং নিরাপদে এবং পরিষ্কারভাবে নির্মানের নির্ভরতার সাথে সম্পর্কিত সংস্করণ রাখতে পারেন। তদুপরি, আমাদের গ্রন্থাগারগুলিকে ওপেন সোর্স প্রকল্প হিসাবে প্রকাশ করা সহজ কারণ গ্রন্থাগারগুলির ইতিহাস তাদের উপর নির্ভরশীল অ্যাপ্লিকেশনগুলির চেয়ে পৃথক (এবং যেগুলি উন্মুক্ত উত্স হতে পারে না)।

আমি কর্মক্ষেত্রে একাধিক প্রকল্পের জন্য ওয়ার্কফ্লো স্থাপন করছি, এবং আমি ভাবছিলাম যে এটি কেমন হবে যদি আমরা একক একক প্রকল্পের পরিবর্তে এই পদ্ধতিকে কিছুটা চূড়ান্তভাবে গ্রহণ করি। আমি তাড়াতাড়ি উপলব্ধি মধ্যে কৃমি একটি সম্ভাব্য নেই সত্যিই উপ-মডিউল ব্যবহার করে।

: অ্যাপ্লিকেশন একজোড়া ত studioএবং player, এবং নির্ভরশীল লাইব্রেরি core, graphএবং network, যেখানে নির্ভরতা নিম্নরূপ:

  • core একক হয়
  • graphউপর নির্ভর করে core(উপ-মডিউল এ এ ./libs/core)
  • networkDepdends on core(উপ-মডিউল এ এ ./libs/core)
  • studioউপর নির্ভর করে graphএবং network(উপ-মডিউলগুলি এ ./libs/graphএবং ./libs/network)
  • playerউপর নির্ভর করে graphএবং network(উপ-মডিউলগুলি এ ./libs/graphএবং ./libs/network)

মনে করুন যে আমরা সিএমকে ব্যবহার করছি এবং এই প্রতিটি প্রকল্পের ইউনিট পরীক্ষা এবং সমস্ত কাজ রয়েছে। প্রতিটি প্রকল্পের (সহ studioএবং player) অবশ্যই কোড মেট্রিক্স, ইউনিট পরীক্ষার, ইত্যাদি সম্পাদনের জন্য একক সংকলন করতে সক্ষম হতে হবে including

জিনিসটি একটি পুনরাবৃত্তিযোগ্য git submodule fetch, তারপরে আপনি নিম্নলিখিত ডিরেক্টরি কাঠামোটি পাবেন:

studio/
studio/libs/                    (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/         (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/       (sub-module depth: 2)
studio/libs/network/libs/core/

প্রকল্পে coreদুবার ক্লোন করা হয়েছে তা লক্ষ্য করুন studio। এই নষ্ট ডিস্কের জায়গা বাদে, আমার একটি বিল্ড সিস্টেমের সমস্যা আছে কারণ আমি coreদু'বার তৈরি করছি এবং আমি এর দুটি পৃথক সংস্করণ সম্ভবত পাব core

প্রশ্ন

আমি কীভাবে সাব-মডিউলগুলি সংগঠিত করব যাতে সাধারণ নেস্টেড সাব-মডিউলগুলির একাধিক অনুলিপি না পেয়ে সংস্করণযুক্ত নির্ভরতা এবং স্বতন্ত্র বিল্ডটি পেতে পারি?

সম্ভাব্য সমাধান

লাইব্রেরি নির্ভরতা যদি কিছুটা পরামর্শ থাকে (যেমন "একটি" সংস্করণ এক্স এর সাথে কাজ করার জন্য পরিচিত "বা" কেবলমাত্র সংস্করণ এক্সটি আনুষ্ঠানিকভাবে সমর্থিত "ফ্যাশন) এবং সম্ভাব্য নির্ভর অ্যাপ্লিকেশন বা লাইব্রেরিগুলি যে কোনও সংস্করণ পছন্দ করে তার সাথে বিল্ডিংয়ের জন্য দায়বদ্ধ, তবে আমি নিম্নলিখিত পরিস্থিতি কল্পনা করতে পারি:

  • এর জন্য বিল্ড সিস্টেমটি রাখুন graphএবং networkতাদের কোথায় পাবেন তা বলুন core(উদাহরণস্বরূপ একটি সংকলকের মাধ্যমে পাথ অন্তর্ভুক্ত)। দুটি স্ট্যান্ডলোন এবং "নির্ভরতা" নির্ধারণ লক্ষ্য নির্ধারণ করুন, যেখানে "স্ট্যান্ডসোনাল" "নির্ভরতা" এর উপর ভিত্তি করে স্থানীয় coreউপ-মডিউলটিতে নির্দেশ করার অন্তর্ভুক্ত পথটি যুক্ত করে ।
  • একটি অতিরিক্ত নির্ভরতা পরিচয় করিয়ে দিন: studioচালু core। তারপরে, সাব-মডিউলটির নিজস্ব অনুলিপিটির অন্তর্ভুক্ত করার পথটি studioতৈরি করে core, সেট করে core, তারপরে graphএবং network"নির্ভরতা" মোডে তৈরি করে।

ফলস্বরূপ ফোল্ডার কাঠামোটি দেখে মনে হচ্ছে:

studio/
studio/libs/                    (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/         (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/       (empty folder, sub-modules not fetched)

যাইহোক, এই কিছু বিল্ড সিস্টেম যাদু (আমি বেশ আত্মবিশ্বাসী এই CMake দিয়ে করা যাবে নই) এবং সংস্করণ আপডেটের পক্ষ থেকে ম্যানুয়াল কাজ বিট (আপডেট প্রয়োজন graphএছাড়াও আপডেট দরকার হবে coreএবং networkএকটি সামঞ্জস্যপূর্ণ সংস্করণ পেতে coreসব প্রকল্পে) ।

এই সম্পর্কে কোন চিন্তা?


মনে রাখবেন যে এই সমস্যাটি চক্রের জন্য নির্দিষ্ট নয়: এটি কোনও সিস্টেম সহ কোনও বিল্ড সিস্টেমের জন্যই বিদ্যমান! (অর্থাত্ যখন এটি পরিকল্পনা করা হয় যে সুপার-প্রকল্পটি কেবল গ্রন্থাগারের উত্সগুলি যুক্ত করে; যার মধ্যে কেবল শিরোনামের লাইব্রেরি রয়েছে)
এমএম

উত্তর:


5

আমি এই পার্টিতে খুব দেরী করেছি, তবে আপনার প্রশ্নের এখনও পুরো উত্তর নেই বলে মনে হচ্ছে না, এবং এটি গুগল থেকে বেশ সুপরিচিত হিট।

আমার সি ++ / সিএমকে / গিট / সাবমডিউলগুলির সাথে হুবহু একই সমস্যা আছে এবং আমি ম্যাটল্যাব / গিট / সাবমডিউলসের সাথে একই রকম সমস্যা পেয়েছি যা ম্যাটল্যাব সংকলিত না হওয়ায় কিছুটা অতিরিক্ত অদ্ভুততা পায়। আমি সম্প্রতি এই ভিডিওটি জুড়ে এসেছি , যা "সমাধানের" প্রস্তাব দেয় বলে মনে হচ্ছে। আমি সমাধানটি পছন্দ করি না, কারণ এর মূল অর্থ সাবমডিউলগুলি ফেলে দেওয়া, তবে এটি সমস্যাটি দূর করে। এটি ঠিক যেমন @ এরর্ডডোভেলপারের পরামর্শ অনুসারে। প্রতিটি প্রকল্পের কোনও সাবমডিউল নেই। একটি প্রকল্প তৈরি করতে, এটি নির্মাণের জন্য একটি সুপার-প্রকল্প তৈরি করুন এবং এটির নির্ভরতার সাথে ভাইবোন হিসাবে অন্তর্ভুক্ত করুন।

সুতরাং আপনার বিকাশের জন্য প্রকল্পটি graphদেখতে এর মতো হতে পারে:

buildgraph/graph
buildgraph/core

এবং তারপরে আপনার স্টুডিওর জন্য প্রকল্পটি হতে পারে:

buildstudio/studio
buildstudio/graph
buildstudio/network
buildstudio/core

সুপার-প্রকল্পগুলি কেবল একটি প্রধান CMakeLists.txtএবং সাবমোডিয়ুলগুলির একগুচ্ছ। তবে প্রকল্পগুলির কোনওটিরই নিজস্ব কোনও সাবমডিউল নেই।

আমি এই পদ্ধতির কাছে কেবলমাত্র ব্যয়টি হ'ল তুচ্ছ "সুপার-প্রকল্পগুলি" এর বিস্তার যা আপনার আসল প্রকল্পগুলি তৈরিতে কেবল নিবেদিত। এবং যদি কেউ আপনার প্রকল্পগুলির মধ্যে একটির হাত ধরে, তবে সুপার-প্রকল্পটি খুঁজে না পেয়ে তার নির্ভরতা কী তা খুঁজে বের করার কোনও সহজ উপায় নেই। উদাহরণস্বরূপ, এটি গিথুবকে সত্যিই কুৎসিত করে তুলতে পারে।


1

আমি মনে করি যে আপনি যখন উভয় graphএবং networkসাবমোডিয়ুলগুলিকে একীভূত করবেন তখন আপনার studioসর্বদা coreইতিহাসের নির্দিষ্ট সময়ে একই সংস্করণ থাকতে হবে studio। আমি simlink হবে studio/libs/coreমধ্যে submodule studio/libs/{graph,network}/libs

হালনাগাদ:

আপনি যে নির্ভরতা বলেছিলেন তা দিয়ে আমি একাধিক সংগ্রহস্থল তৈরি করেছি:

./core      <--- (v2)
./graph
./graph/libs
./graph/libs/core  <--- (v2)
./graph/.gitmodules
./network
./network/libs
./network/libs/core  <--- (v1)
./network/.gitmodules
./studio
./studio/libs
./studio/libs/graph
./studio/libs/graph/libs
./studio/libs/graph/libs/core <--- (v1)
./studio/libs/graph/.gitmodules
./studio/libs/network
./studio/libs/network/libs
./studio/libs/network/libs/core  <--- (v1)
./studio/libs/network/.gitmodules
./studio/studio
./studio/.gitmodules

v1এবং v2দুটি ভিন্ন সংস্করণ coregraphসংস্করণ 2 পরিচালনা করে, যেখানে networkকিছু কাজের প্রয়োজন হয় এবং সংস্করণ 1 এ আটকে আছে, কার্যক্রমে প্রোগ্রাম করার জন্য উভয় পয়েন্টের studioস্থানীয় এম্বেড সংস্করণ । এখন, বিল্ড দৃষ্টিকোণ বাদে সবকিছু সাবমডিউলগুলি দিয়ে ভালভাবে কাজ করে।corev1

আমি এখন নিম্নলিখিত ডিরেক্টরিটি মুছে ফেলতে পারি:

./studio/libs/network/libs/core

এবং এটি প্রতীকী লিঙ্কের সাথে প্রতিস্থাপন করুন:

./studio/libs/network/libs/core@ -> ../../graph/libs/core/

আমি স্থানীয়ভাবে এই পরিবর্তন কমিট এবং দুটি পৃথক সংস্করণ ক্ষমতা হারাতে coreভিতরে studio, কিন্তু আমি শুধুমাত্র বিল্ড coreএকবার। আমি যখন আপগ্রেড করার জন্য প্রস্তুত তখন v2আমি এটি করতে পারি:

 git submodule update # (--rebase ?)

... স্টুডিও / লাইবস / নেটওয়ার্কের ভিতরে।


প্রতীকী লিঙ্ক ধারণাটি আমার মনকে অতিক্রম করেছিল, তবে এটি একটি সমাধান নয়। যদি আপনি graph/libs/coreবাইরের সাথে লিঙ্ক করেন তবে আপনি সাবমডিউলটি ব্যবহার করছেন না। আপনি যদি studio/libs/coreসাব-মডিউলটির নিজস্ব একটি লাইব্রেরি থেকে লিঙ্ক করেন, তবে আপনি কোনটি বেছে নেবেন graphবা network? তদুপরি, তিন বা ততোধিক স্তর গভীর হলে কী হয়? পরিশেষে, যদি coreসংশোধনগুলির একটি পরিসীমা হতে পারে what এটা তোলে সুস্পষ্ট না যে আপনি পারেন সংস্করণে লিঙ্ক করতে চাই coreযে graphএবং networkব্যবহার করছেন।
আন্দ্রে ক্যারন

"আপনি কোনটি বেছে নিন?" : coreমূল coreলাইব্রেরি থেকে প্রাপ্ত একটি উপ-মডেল হবে , এমন সংস্করণে আপডেট হবে যা উভয়ের সাথে সামঞ্জস্যপূর্ণ graphএবং network(আপনার অবশ্যই সিদ্ধান্ত নিতে হবে কোনটি ভাল)। প্রতীকী লিঙ্কগুলি স্থানীয় graphএবং networkসাবমডিউলগুলিতে যুক্ত করা হবে (বিবিধ)
coredump

1
প্রতীকী লিঙ্কগুলি আপনাকে যুক্ত করার প্রস্তাব দেয় graphএবং networkতাদের নিজস্ব সংগ্রহস্থলের বাইরে নির্দেশ করবে (যেমন studioপ্রকল্পের অন্য কোনও জায়গায় )। প্রতীকী লিঙ্কটি কখন ব্যবহার করবেন তার বিপরীতে তাদের নিজস্ব উপ-মডিউলটি কীভাবে ব্যবহার করবেন তা তারা কীভাবে জানতে পারে? আপনার চিন্তাভাবনাটি দেখানোর জন্য সম্ভবত আপনার একটি উদাহরণ যুক্ত করা উচিত।
আন্দ্রে কারন

0

আমি এটিকে কেবলমাত্র একটির উপ-মডিউল গভীরতা এবং এটিতে একটি ভাণ্ডার রাখব যা সমস্ত মডিউলগুলিকে উপ-মডিউল হিসাবে রাখে এবং README এবং বিল্ড স্ক্রিপ্টগুলি ব্যতীত অন্য কিছুই রাখে। প্রতিটি প্যাকেজকে এর নির্ভরতাগুলির সাথে যুক্ত করে আলাদা আলাদা বিল্ড স্ক্রিপ্ট থাকবে be অন্যথায় আপনার কাছে প্যাকেজের জন্য পৃথক রেপো থাকতে পারে।


1
আমার পোস্টে এটি পরিষ্কার ছিল কিনা তা আমি নিশ্চিত নই, তবে আমার কাছে একাধিক অ্যাপ্লিকেশন রয়েছে যা একই লাইব্রেরিতে নির্ভর করে এবং আমি অ্যাপ্লিকেশনগুলিতে লাইব্রেরির জন্য বিল্ড স্ক্রিপ্টগুলি নকল করতে চাই না।
আন্দ্রে কারন

3
এটি বিভিন্ন সমস্যার সমাধান করে কীভাবে তা দেখানোর জন্য আপনার উত্তরের বিবরণ দেওয়া উচিত। আপনি নির্ভরতা কীভাবে সংযুক্ত করেছেন তা ঠিক আমার কাছে পরিষ্কার নয় যে প্রসঙ্গে, নির্ভরযোগ্য লাইব্রেরি একই স্থানে নেই।
আন্দ্রে কারন

0

আমি সাবমডিউল ব্যবহার করব না।

এটি লোভনীয়, এসএনএন-এক্সটার্নালদের ক্ষেত্রে ব্যবহৃত হিসাবে একই। তবে, আপনি কি নিশ্চিত হতে পারেন যে আপনি যে প্রকল্পগুলি সংযুক্ত করেছেন তার সবগুলিই এক বছরে একই জায়গায় রয়েছে? পাঁচটার মধ্যে কী হবে?

অতএব, আমি কেবলমাত্র আমার প্রকল্পে সমস্ত প্রয়োজনীয় নির্ভরতা অনুলিপি করছি। এর অর্থ হ'ল যতক্ষণ আমার রেপো কার্যকর হয় ততক্ষণ আমি সঠিক অবস্থাটি চেকআউট করতে পারি।

মূলত, আমার নিম্নরূপে একটি ফোল্ডার কাঠামো রয়েছে:

myproject/... [sources etc]
ext/ [third-party dependencies]


e.g. ext/boost, ext/cppunit

যদিও এটি কোনও ডিস্ক-স্পেসের দৃষ্টিকোণ থেকে খুব সুন্দর নয়, আমি গ্যারান্টিটির মূল্য দিচ্ছি যে যতক্ষণ রেপো অনেক বেশি পাওয়া যায় ততক্ষণ আমি রেকর্ডকৃত প্রতিটি রাজ্য পরীক্ষা করে দেখতে পারি।

এছাড়াও, এখানে বর্ণিত সাবমডিউলগুলির সাথে একগুচ্ছ সমস্যা রয়েছে


আমি নিশ্চিত যে তারা সঠিক অবস্থানে রয়েছে কারণ আমি তাদের সকলকে বজায় করছি :-) এছাড়াও, পুনঃ বিতরণ শর্তের কারণে প্রকল্পগুলি অনুলিপি করতে সাবধান হন।
আন্দ্রে কারন

ঠিক আছে, এটি সমস্যা হ্রাস করে। এবং লাইসেন্সিং: হ্যাঁ, আপনাকে সতর্কতা অবলম্বন করতে হবে তবে এটি সম্পূর্ণ আলাদা সমস্যা।
উইলবার্ট

0

ঠিক এখানে একই সমস্যা সম্মুখীন। সমাধান এক কিছু রেপো আছে হতে পারে libsযে রাখা হবে core, network, graphsubmodules এবং মাত্র CMakeLists যে লিব যেখানে তার নির্ভরতা খুঁজে পেতে প্রতিটি জানিয়ে দেবে হিসাবে। প্রতিটি অ্যাপ্লিকেশনটিতে এখন libsসাব-মডিউল থাকবে এবং কেবল প্রয়োজনীয় লিবস ব্যবহার করা হবে।

প্রতিটি স্তরের পরীক্ষা 2 উপায়ে সেটআপ করা যেতে পারে:

  • আলাদা আলাদা অ্যাপ্লিকেশন হিসাবে কোর_স্টেস্টিং, গ্রাফ-টেস্টিং, নেটওয়ার্ক_স্টেসিং করুন
  • চেক-সার্ভারগুলিতে পরীক্ষিত লিবগুলি মোতায়েন করুন এবং চতুর ব্যবহারের মাধ্যমে পরীক্ষা চালানোর সময় তাদের সন্ধান করুন

এটি কি সমস্ত অন্যান্য লিবসের জন্য সমস্ত লিবস উপলব্ধ করে না?
আন্দ্রে কারন

ডিফল্টরূপে, হ্যাঁ তবে এটি সিদ্ধান্ত নেওয়া যেতে পারে লিবস-লেভেলের চক্রবিদ্বেষীদের মধ্যে। যদি graphজেনে রাখার দরকার না হয় network- সাবডিরের সাথে networkসম্পর্কযুক্ত জিনিসগুলি পাস করবেন নাgraph
সর্বাধিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.