একাধিক ফাইল গো প্রকল্পের আয়োজন [বন্ধ]


238

নোট: এই প্রশ্নের সঙ্গে সম্পর্কযুক্ত এই এক , কিন্তু দুই বছর যান ইতিহাসে একটি খুব দীর্ঘ সময়।

উন্নয়নের সময় গো প্রকল্পটি সংগঠিত করার মানক উপায় কী?

আমার প্রকল্পটি একটি একক প্যাকেজ mypack, সুতরাং আমি অনুমান করি যে আমি সমস্ত .go ফাইল mypackডিরেক্টরিতে রেখেছি ।

তবে তারপরে, আমি এটি বিকাশের সময় পরীক্ষা করতে চাই তাই আমার কমপক্ষে একটি mainপ্যাকেজ ঘোষণা করার জন্য একটি ফাইলের প্রয়োজন , যাতে আমি এটি করতে পারিgo run trypack.go

আমি এটি কীভাবে সংগঠিত করব? আমি go install mypackযখনই চেষ্টা করতে চাই তখন কি আমার কি করা উচিত?


14
এই সংক্ষিপ্ত স্ক্রিনকাস্টটি দুর্দান্ত:
ম্যাট

এই কিভাবে প্যাকেজের সাথে একটি প্রকল্প সংগঠিত করার বুঝতে আরেকটি সহায়ক লিঙ্ক। সরকারী কোডটি কীভাবে লিখতে হয় তার থেকে অনুসরণ করা সহজ বলে আমি মনে করি।
IamNaN

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

উত্তর:


171

আমি কীভাবে গো কোড লিখব সে বিষয়ে এই পৃষ্ঠাটি পর্যালোচনা করার পরামর্শ দেব

এটি কীভাবে আপনার প্রকল্পটি go buildবন্ধুত্বপূর্ণ উপায়ে গঠন করবেন এবং কীভাবে পরীক্ষাগুলি লিখবেন তা উভয়ই দলিল করে । mainপ্যাকেজটি ব্যবহার করে টেস্টগুলির কোনও সেমিডি হওয়া দরকার না । এগুলি প্রতিটি প্যাকেজের অংশ হিসাবে কেবল টেস্টএক্স নামের ফাংশন হতে পারে এবং তারপরে go testসেগুলি আবিষ্কার করবে।

আপনার প্রশ্নের সেই লিঙ্কে প্রস্তাবিত কাঠামোটি কিছুটা পুরানো, এখন গো 1 প্রকাশের সাথে। আপনার আর pkgডিরেক্টরি অধীন ডিরেক্টরি স্থাপন করার দরকার নেই src। কেবলমাত্র 3 টি সম্পর্কিত-সম্পর্কিত ডিরেক্টরিগুলি আপনার GOPATH এর মূলের 3: বিন, পিকেজি, এসসিআর। এসআরসি-র নীচে, আপনি কেবল আপনার প্রকল্পটি স্থাপন করতে পারেন mypack, এবং এর নীচে মাইপ্যাক_স্টেস্ট.গো সহ আপনার .go ফাইলগুলির সমস্ত রয়েছে is

go build এরপরে রুট লেভেল পিকেজি এবং বিনের মধ্যে তৈরি হবে।

সুতরাং আপনার গোপথ এইরকম দেখতে পারে:

~/projects/
    bin/
    pkg/
    src/
      mypack/
        foo.go
        bar.go
        mypack_test.go

export GOPATH=$HOME/projects

$ go build mypack
$ go test mypack

আপডেট:> = 1.11 -এর হিসাবে, মডিউল সিস্টেমটি এখন টুলিংয়ের একটি স্ট্যান্ডার্ড অংশ এবং জিওপ্যাথ ধারণাটি অপ্রচলিত হওয়ার কাছাকাছি।


26
ভেরিয়েবলগুলি রফতানি করার সময় of এর পরিবর্তে OME হোম ব্যবহার করুন।
জোহান এস

6
ভেরিয়েবলগুলি রফতানি করার সময় কেন $ HOME এর চেয়ে বেশি প্রস্তাব দেওয়া হয়?
425nesp

8
কারণ কোনও পরিবর্তনশীল নয়, কেবল একটি উপনাম।
পাইহ

6
@ 425nesp জোহান ভুল হয়েছে - এটি হয় না। শেলগুলি পরিবর্তিত হয়, তবে পরিবেশগত পরিবর্তনশীলগুলি সেট করার সময় ব্যাশ প্রসারিত হয়~ এবং উদাহরণস্বরূপ ব্যস্তবক্সটি বোর্ন শেলটিও ঘটে। এটি নিজেই চেষ্টা করুন: export BOB=~ && env | grep ^BOBফল দেবেBOB=/your/homedir
অস্টিন অ্যাডামস

1
$HOMEতারপরে আরও শেলগুলিতে কাজ করে ~, উদাহরণস্বরূপfish
হোইজুই

60

jdi এর ব্যবহার সম্পর্কিত সঠিক তথ্য আছে GOPATH। আমি যুক্ত করব যে আপনি যদি বাইনারি পাশাপাশি রাখতে চান তবে আপনি ডিরেক্টরিগুলিতে একটি অতিরিক্ত স্তর যুক্ত করতে চাইতে পারেন।

~/projects/src/
    myproj/
        mypack/
            lib.go
            lib_test.go
            ...
        myapp/
            main.go

চলমান প্যাকেজটি go build myproj/mypackনির্মাণ mypackকরবে তার নির্ভরতাগুলির সাথে চলমান চলমান বাইনারিটি নির্ভরতাগুলির সাথে go build myproj/myappবানাবে myappযা সম্ভবত mypackগ্রন্থাগারের অন্তর্ভুক্ত রয়েছে ।


এটি অবশ্যই বোঝাতে পারে, যদি সে আসলে একটি প্রধান সেমিডি থাকে have দেখে মনে হচ্ছে তিনি কেবল একটি লাইব্রেরি প্যাকেজ তৈরি করছেন।
jdi

50

আমি বেশিরভাগ গো প্রকল্পগুলি অধ্যয়ন করেছি এবং এখানে যথেষ্ট পরিমাণে তারতম্য রয়েছে। কে সি থেকে আসছে এবং কে জাভা থেকে আসছে, আপনি প্রকারের প্রকল্পের মূল ডিরেক্টরিতে সমস্ত কিছু সম্পর্কে প্রাক্তন ডাম্প হিসাবে বলতে পারেনmain প্যাকেজের মধ্যে, এবং পরবর্তীটি সমস্ত কিছু একটি srcডিরেক্টরিতে রাখার ঝোঁক । উভয়ই অনুকূল নয়। প্রত্যেকের পরিণতি হয় কারণ তারা আমদানির পাথগুলিকে প্রভাবিত করে এবং অন্যরা কীভাবে তাদের পুনরায় ব্যবহার করতে পারে।

সর্বোত্তম ফলাফল পেতে আমি নিম্নলিখিত পদ্ধতির কাজ করেছি।

myproj/
  main/
    mypack.go
  mypack.go

কোথায় mypack.goহয় package mypackএবং main/mypack.goআছে (সম্ভবত)package main

আপনার যদি অতিরিক্ত সমর্থন ফাইলের প্রয়োজন হয় তবে আপনার দুটি পছন্দ আছে। হয় সেগুলি সমস্তকে মূল ডিরেক্টরিতে রাখুন, বা ব্যক্তিগত সহায়তার ফাইলগুলিকে একটি libউপ ডিরেক্টরিতে রেখে দিন। যেমন

myproj/
  main/
    mypack.go
  myextras/
    someextra.go
  mypack.go
  mysupport.go

অথবা

myproj.org/
  lib/
    mysupport.go
    myextras/
      someextra.go
  main/
    mypack.go
  mypage.go

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

myproj.org/mypackঅন্য প্রকল্পগুলিতে কোডটি পুনরায় ব্যবহার করার জন্য এইভাবে জিনিসগুলি করা আপনাকে একটি দুর্দান্ত আমদানির পথ দেয় । আপনি যদি ব্যবহার করেন libতবে অভ্যন্তরীণ সহায়তা ফাইলগুলিতে একটি আমদানির পথ থাকবে যা এর সূচক myproj.org/lib/mysupport

প্রকল্পটি তৈরি করার সময় main/mypack, যেমন , ব্যবহার করুন go build main/mypack। যদি আপনার একাধিক এক্সিকিউটেবল থাকে তবে আপনি mainপৃথক প্রকল্প তৈরি না করেও এগুলিকে পৃথক করতে পারেন। যেমন main/myfoo/myfoo.goএবং main/mybar/mybar.go


14
ইডোম্যাটিক হ'ল cmd/nameOfMyExecutableপ্রধান প্যাকেজের জন্য একটি উপ ডিরেক্টরি ব্যবহার করা (কেবল cmd/…যদি আপনার একাধিক কমান্ড থাকে তবে প্রয়োজন ; দেখুন golang.org/x/tools/cmd; অন্যথায় এটি চারপাশে অদলবদল main.goকরা এবং শীর্ষ স্তরে থাকতে পারে)। আপনার কাছে যেভাবে রয়েছে এটি go installএকটি "প্রধান" (বা "মেইন.এক্সএই") এক্সিকিউটেবল তৈরি করবে। এছাড়াও, আইডিয়োমেটিক হ'ল internalপ্যাকেজ / প্রোগ্রামের অভ্যন্তরীণ উপ-প্যাকেজটির জন্য একটি উপ-ডিরেক্টরি ব্যবহার করা যা অন্য কোথাও ব্যবহার করা উচিত নয় (এটি প্রত্যাশিত যে ভবিষ্যতের সংস্করণ গো অন্যরকমভাবে internalপ্যাকেজ আমদানি করবে না) enforce
ডেভ সি

21

কালেব ডক্স্সি রচিত বইয়ের এই অধ্যায়টি http://www.golang-book.com/11 এই অধ্যায়টি কীভাবে গোলাংয়ে কোডটি সংগঠিত করবেন তা বুঝতে আমি খুব দরকারী বলে মনে করি


13

গো প্রকল্পগুলি সংগঠিত করার মানক উপায় বলে মনে হয় না তবে https://golang.org/doc/code.html বেশিরভাগ প্রকল্পের জন্য একটি সেরা অনুশীলন নির্দিষ্ট করে। jdi এর উত্তরটি ভাল তবে আপনি যদি গিথব বা বিটবাকেট ব্যবহার করেন এবং আপনার অতিরিক্ত গ্রন্থাগারও রয়েছে, আপনার নিম্নলিখিত কাঠামোটি তৈরি করা উচিত:

~/projects/
bin/
pkg/
src/
  github.com/
    username/
        mypack/
            foo.go
            bar.go
            mypack_test.go
        mylib/
            utillib.go
            utillib_test.go

এইভাবে এটি করার মাধ্যমে, আপনি মাইলিবের জন্য একটি পৃথক সংগ্রহস্থল রাখতে পারেন যা অন্যান্য প্রকল্পের জন্য ব্যবহার করা যেতে পারে এবং "গো গেট" দ্বারা পুনরুদ্ধার করা যেতে পারে। আপনার মাইপ্যাক প্রকল্পটি "github.com/username/mylib" ব্যবহার করে আপনার গ্রন্থাগারটি আমদানি করতে পারে। আরও তথ্যের জন্য:

http://www.alexvictorchan.com/2014/11/06/go-project-structure/


6

ফাইলগুলিকে একই ডিরেক্টরিতে রাখুন package mainএবং সমস্ত ফাইলে ব্যবহার করুন ।

myproj/
   your-program/
      main.go
      lib.go

তারপরে চালান:

~/myproj/your-program$ go build && ./your-program

কিভাবে এই কাজ করতে পারেন? আপনার main.go প্যাকেজ প্রধান হতে হবে; সম্ভবত lib.go ভিন্ন প্যাকেজে থাকে, তবে গো সরঞ্জামটি অভিযোগ করে যে আপনার একটি ফোল্ডারে দুটি প্যাকেজ থাকতে পারে না।
I82Much

1
@ আই 82২ এমপি ওপি অনেকগুলি ফাইলে কীভাবে একটি প্যাকেজ, মূল প্রোগ্রামটি বিভক্ত করতে পারে তার জন্য জিজ্ঞাসা করে। lib.go এক্ষেত্রে একই প্যাকেজে রয়েছে।
গুস্তাভ

আহ স্পষ্ট করার জন্য ধন্যবাদ।
I82Much

@ গুস্তাভ, আমারও একই প্রশ্ন আছে। মনে হচ্ছে যদি আমি প্যাকেজটি মূলত lib.go এ রাখি, মেইন.গোতে, আমি lib.go এ সংজ্ঞায়িত ফাংশনগুলি কল করতে পারি না
কিয়ান চেন

@ এলজসকিয়ানচেন পদ্ধতিগুলি জনসাধারণের হওয়া দরকার, এটি একটি মূলধন দিয়ে শুরু করতে হবে। যেমন মাইমেথড () বা মাই স্ট্রাস্ট {...}}
গুস্তাভ

6

go get repository_remote_urlকমান্ড কীভাবে প্রকল্পের কাঠামোটি পরিচালনা করে তা এক্সপ্লোরার আসুন $GOPATH। আমরা যদি এটি করি তবে go get github.com/gohugoio/hugoএটির অধীনে সংগ্রহস্থলটি ক্লোন করবে

$ GOPATH / src / repository_remote / ব্যবহারকারী_নাম / প্রকল্প_নাম


$ GOPATH / src / github.com/gohugoio/hugo

এটি আপনার প্রাথমিক প্রকল্পের পথ তৈরির একটি দুর্দান্ত উপায় । এখন আসুন এখানে কী কী প্রজেক্ট রয়েছে এবং কীভাবে তাদের অভ্যন্তরীণ কাঠামোগুলি সংগঠিত হয়েছে তা অন্বেষণ করি সম্প্রদায়ের সমস্ত গোলং প্রকল্পগুলি এর অধীনে শ্রেণিবদ্ধ করা যেতে পারে

  • Libraries (নির্বাহযোগ্য বাইনারি নেই)
  • Single Project (শুধুমাত্র ১ টি এক্সিকিউটেবল বাইনারি রয়েছে)
  • Tooling Projects (একাধিক এক্সিকিউটেবল বাইনারি থাকে)

সাধারণত গোলং প্রকল্প ফাইলগুলি ডিডিডি , পিওডি-র মতো যে কোনও ডিজাইনের নীতিমালার অধীনে প্যাকেজ করা যায়

বেশিরভাগ উপলভ্য গো প্রকল্পগুলি এই প্যাকেজ ওরিয়েন্টেড ডিজাইন অনুসরণ করে

প্যাকেজ ওরিয়েন্টেড ডিজাইন বিকাশকারীকে কেবলমাত্র তার নিজস্ব প্যাকেজগুলির মধ্যেই বাস্তবায়ন রাখতে উত্সাহিত করে, প্যাকেজগুলি ছাড়াও যে /internalপ্যাকেজগুলি একে অপরের সাথে যোগাযোগ করতে পারে না


লাইব্রেরি

  • ডাটাবেস ড্রাইভার , কিউটি হিসাবে প্রকল্পগুলি এই বিভাগের মধ্যে রাখতে পারে।
  • যেমন কিছু লাইব্রেরি রঙ , এখন অন্য কোন প্যাকেজ ছাড়া একটি ফ্ল্যাট গঠন অনুসরণ করে।
  • এই লাইব্রেরি প্রকল্পগুলির বেশিরভাগই অভ্যন্তরীণ নামে একটি প্যাকেজ পরিচালনা করে
  • /internal প্যাকেজটি মূলত অন্যান্য প্রকল্পগুলি থেকে বাস্তবায়নটি গোপন করতে ব্যবহৃত হয়।
  • কোনও এক্সিকিউটেবল বাইনারি নেই, তাই মূল ফানকযুক্ত কোনও ফাইল নেই ।

 ~/$GOPATH/
    bin/
    pkg/
    src/
      repository_remote/
        user_name/
            project_name/
              internal/
              other_pkg/

একক প্রকল্প

  • যেমন প্রকল্প যেমন হুগো , etcd টি একক তৃণমূল পর্যায়ে এবং প্রধান func।
  • একটি একক বাইনারি তৈরির লক্ষ্য Tar

সরঞ্জামাদি প্রকল্প

  • যেমন প্রকল্প kubernetes , গো-ethereum হয়েছে একাধিক প্রধান একটি প্যাকেজ নামক অধীনে সংগঠিত func cmd কমান্ড
  • cmd/ প্যাকেজটি বাইনারিগুলির সংখ্যা (সরঞ্জামগুলি) পরিচালনা করে যা আমরা তৈরি করতে চাই

 ~/$GOPATH/
    bin/
    pkg/
    src/
      repository_remote/
        user_name/
            project_name/
              cmd/
                binary_one/
                   main.go
                binary_two/
                   main.go
                binary_three/
                   main.go
              other_pkg/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.