কি বিল্ড বিল্ড যেতে না? (যান বনাম বনাম যান ইনস্টল)


106

নিউ গো প্রোগ্রামাররা প্রায়শই জানেন না বা বিভ্রান্ত হন যা মৌলিক গো বিল্ড কমান্ডটি কী করে।

ঠিক কীভাবে go buildএবং go installআদেশগুলি তৈরি করে এবং ফলাফল / আউটপুটটি কোথায় রাখে?


উত্তর:


125

কি goকমান্ড কিনা আমরা একটি "স্বাভাবিক" প্যাকেজের জন্য এটি চালানোর বা বিশেষ জন্য নির্ভর "main"প্যাকেজ।

প্যাকেজগুলির জন্য

  • go build  আপনার প্যাকেজ তৈরি করে তারপরে ফলাফলগুলি বাতিল করে দেয়
  • go installতারপরে আপনার ডিরেক্টরিতে প্যাকেজ ইনস্টল করে তোলে $GOPATH/pkg

কমান্ডের জন্য (প্যাকেজ main)

  • go build  কমান্ডটি তৈরি করে এবং ফলাফলটি বর্তমান কার্যক্ষম ডিরেক্টরিতে ফেলে দেয়
  • go installঅস্থায়ী ডিরেক্টরিতে কমান্ডটি তৈরি করে তারপরে এটি সরানো হয় $GOPATH/bin

কি পাস go build?

আপনি পাস হতে পারে প্যাকেজ থেকে go build, প্যাকেজ আপনি গড়তে চাই। আপনি .goএকটি একক ডিরেক্টরি থেকে ফাইলগুলির একটি তালিকাও পাস করতে পারেন , যা পরে একক প্যাকেজ নির্দিষ্ট করে এমন উত্স ফাইলগুলির তালিকা হিসাবে বিবেচিত হবে।

যদি কোনও প্যাকেজ (আমদানির পাথ) সরবরাহ না করা হয় তবে বর্তমান ডিরেক্টরিটিতে বিল্ডটি প্রয়োগ করা হবে।

আমদানির পথে একটি বা একাধিক "..."ওয়াইল্ডকার্ড থাকতে পারে (এটি ক্ষেত্রে এটি একটি নিদর্শন )। ...যে কোনও স্ট্রিংয়ের সাথে net/...মিল রাখতে পারে , যেমন netপ্যাকেজ এবং প্যাকেজগুলির সাথে এটির যে কোনও সাবফোল্ডার রয়েছে তার সাথে মেলে । আদেশ

go build ./...

প্রায়শই বর্তমান ফোল্ডারে প্যাকেজ তৈরি করতে এবং সমস্ত প্যাকেজগুলি পুনরাবৃত্তি করতে ব্যবহৃত হয়। একটি প্রকল্পের রুটে জারি করা এই আদেশটি সম্পূর্ণ প্রকল্পটি তৈরি করে।

প্যাকেজ নির্দিষ্ট করার বিষয়ে আরও জানতে চালনা করুন go help packages

মডিউল সম্পর্কে

গো মডিউলগুলির প্রাথমিক সমর্থন গো 1.11 সালে চালু হয়েছিল এবং মডিউলগুলি Go 1.13 দিয়ে শুরু হয়ে ডিফল্ট হয়েছিল। যখন goসরঞ্জামটি কোনও ফোল্ডার থেকে চালিত হয় যার মধ্যে একটি go.modফাইল থাকে (বা বর্তমান ফোল্ডারের মা-বাবার মধ্যে একটি) থাকে, তখন goটুলটি মডিউল-সচেতন মোডে চলে (লিগ্যাসি মোডটিকে বলা হয় জিওপ্যাথ মোড )।

মডিউল-সচেতন মোডে, গোপথ কোনও বিল্ড চলাকালীন আর আমদানির অর্থ সংজ্ঞায়িত করে না, তবে এটি ডাউনলোড করা নির্ভরতা (জিওপিএটিএইচ / পিকেজি / মোডে) এবং ইনস্টলড কমান্ডগুলি (জিওপিএইচটি / বিনে, গোবিন সেট না করা থাকে) সঞ্চয় করে।

মডিউলগুলি তৈরি করার সময়, বিল্ড তালিকার মাধ্যমে যা নির্মিত হয় তা সুনির্দিষ্ট করা হয় । বিল্ড তালিকায় প্রাথমিকভাবে কেবলমাত্র মূল মডিউল থাকে (ডিরেক্টরিটি সম্বলিত মডিউল যেখানে goকমান্ডটি চালিত হয়) এবং মূল মডিউলটির নির্ভরতা বিল্ড তালিকায় যুক্ত হয়, পুনরাবৃত্তভাবে (নির্ভরতার নির্ভরতাও যুক্ত করা হয়)।

আরও তথ্যের জন্য, চালান go help modules


মূলত আপনি go buildএকটি চেক হিসাবে ব্যবহার করতে পারেন যা প্যাকেজগুলি নির্মিত হতে পারে (তাদের নির্ভরতার সাথে) go installএছাড়াও (স্থায়ীভাবে) আপনার সঠিক ফোল্ডারে ফলাফল ইনস্টল করে $GOPATH

go build সবকিছু ঠিকঠাক থাকলে নিঃশব্দে অবসান হবে এবং প্যাকেজগুলি নির্মাণ / সংকলন না করতে পারলে আপনাকে ত্রুটি বার্তা দেবে।

যখনই goসরঞ্জামটি একটি প্যাকেজ বা বাইনারি ইনস্টল করে, এটি যা কিছু নির্ভর করে সেগুলিও ইনস্টল করে, তাই চলমান go installআপনার প্রোগ্রামটি প্যাকেজগুলিও ইনস্টল করবে (সর্বজনীনভাবে উপলব্ধ, "গেটে টেবিল" প্যাকেজগুলি) স্বয়ংক্রিয়ভাবে।

শুরু করার জন্য, সরকারী কোডটি কীভাবে লিখতে হয় পৃষ্ঠা পৃষ্ঠাটি পড়ুন।

goসরঞ্জাম সম্পর্কে আরও তথ্য : কমান্ড গো

আপনি নিম্নলিখিত কমান্ডটি চালিয়ে আরও সহায়তা পেতে পারেন:

go help build

এটি লক্ষণীয় যে, গো 1.5 এর সাথে শুরু go installকরা go build( উত্স ) দ্বারা নির্মিত এক্সিকিউটেবলগুলিও সরিয়ে দেয় :

যদি 'গো ইনস্টল করুন' (কোনও যুক্তি ছাড়াই, বর্তমান ডিরেক্টরি অর্থ) সফল হয়, উপস্থিত থাকলে 'Go বিল্ড' দ্বারা লেখা এক্সিকিউটেবলকে সরিয়ে দিন। এটি একটি বাসি বাইনারি পিছনে রেখে এড়ানো ...

তালিকাটি সম্পূর্ণ করতে, go runআপনার অ্যাপ্লিকেশনটিকে একটি অস্থায়ী ফোল্ডারে সংকলন করে এবং কার্যকর করা বাইনারি শুরু করে। অ্যাপটি প্রস্থান করার সময় এটি অস্থায়ী ফাইলগুলি সঠিকভাবে পরিষ্কার করে।

ডেভ চেনি এর দ্বারা অনুপ্রাণিত প্রশ্নটি বিল্ড বিল্ড কী করে?


1
অদ্ভুত বলে মনে হচ্ছে যে ইনস্টল করুন এক্সিকিউটেবল আপডেট করে না যদি এর আগে ইনস্টল করা কোনওটির সাথে মিল থাকে ... এখানে কোনও অন্তর্দৃষ্টি?
স্কট স্টেনসল্যান্ড

14

প্যাকেজের জন্য:

go build: আপনার প্যাকেজ তৈরি করে তারপরে ফলাফলগুলি বাতিল করে দেয়

গো 1.10 (Q1 2018) এর পরে এটি সত্য হবে না, সিএল 68116 এবং সিএল 75473 কে ধন্যবাদ । এই থ্রেডটি দেখুন , আমি এখানে উল্লেখ করছি।

ঠিক কী কাজ করে go buildএবং go installকমান্ডগুলি তৈরি করে

যখনই গো সরঞ্জাম কোনও প্যাকেজ বা বাইনারি ইনস্টল করে, এটি তার যে কোনও নির্ভরতা ইনস্টল করে, তাই চলমান গো ইনস্টল স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে আপনার প্রোগ্রামের উপর নির্ভর করে (সর্বজনীনভাবে উপলব্ধ, "গেটে টেবিল" প্যাকেজগুলি) প্যাকেজগুলি ইনস্টল করে।

আসলে ... নতুন ক্যাশে ছাড়াওgo install Go 1.10 এর সাথেও পরিবর্তন হবে :

" go install" কমান্ডটি আর নামযুক্ত প্যাকেজগুলির ( সিএল 75850 ) নির্ভরতা ইনস্টল করে না

আপনি যদি " go install foo" চালনা করেন তবে কেবল ইনস্টল করা জিনিসfoo

আগে, এটি বিভিন্ন ছিল। যদি নির্ভরতাগুলি পুরানো হয়ে থাকে তবে " go install" কোনও নির্ভরতাও ইনস্টল করে।
" go install" এর সময় নির্ভরতাগুলির অন্তর্নিহিত ইনস্টলেশন ব্যবহারকারীর জন্য প্রচুর বিভ্রান্তি ও মাথা ব্যথার কারণ হয়ে দাঁড়ায়, তবে পূর্বে ইনক্রিমেন্টাল বিল্ডগুলি সক্ষম করা প্রয়োজন ছিল।
আর না.
আমরা মনে করি যে নতুন install what I saidশব্দার্থবিজ্ঞানগুলি অনেক বেশি বোধগম্য হবে, বিশেষত যেহেতু বাগ রিপোর্টগুলি থেকে এটি পরিষ্কার হয়েছে যে অনেক ব্যবহারকারী ইতিমধ্যে তাদের প্রত্যাশা করেছিলেন।
" go install" চলাকালীন নির্ভরতা স্থাপনের জন্য জোর করতেgo install -i , " go build -i" এবং " go test -i" এর সাথে উপমা দিয়ে নতুন " " ব্যবহার করুন

যে go installকোনও পুনর্নির্মাণ নির্ভরতা ইনস্টল করতে " " ব্যবহৃত হত তা প্রায়শই একযোগে বিভ্রান্তির সৃষ্টি করে -aযার অর্থ " force rebuild of all dependencies"।
এখন, " go install -a myprog" নিজেই myprogপাশাপাশি সমস্ত নির্ভরতার সম্পূর্ণ পুনর্নির্মাণকে বাধ্য করবে myprog, তবে কেবল myprogইনস্টল হবে। (পুনর্নির্মাণ করা সমস্ত নির্ভরশীলতা অবশ্যই বিল্ড ক্যাশে সংরক্ষণ করা হবে, অবশ্যই।)
নতুন বিষয়বস্তু ভিত্তিক staleness বিশ্লেষণের সাথে একযোগে এই কেসটি আরও বোধগম্যভাবে করা বিশেষত গুরুত্বপূর্ণ, কারণ এটি পূর্বের তুলনায় প্রায়শই নির্ভরতা পুনর্নির্মাণের ভাল কারণ দেখায় , যা "আমার নির্ভরতা কেন ইনস্টল হল" বিভ্রান্তির পরিমাণ বাড়িয়ে তুলত।
উদাহরণস্বরূপ, যদি আপনি " go install -gcflags=-N myprog" চালনা করেন তবে এটি একটি ইনস্টল করেmyprogকোন সংকলক অপ্টিমাইজেশান সহ নির্মিত, তবে এটি আর myprogকম্পাইলার অপ্টিমাইজেশান ছাড়াই স্ট্যান্ডার্ড লাইব্রেরি থেকে প্যাকেজগুলি পুনরায় ইনস্টল করে না।


না go build, getএস? আমি একটি বিল্ড ত্রুটি আছে cannot find package "github.com/spf13/cobra" in any of:…। এটি পেতে কীভাবে এটি বলতে হয় তা আমি জানি না। আমার কি স্পষ্টভাবে পাওয়া দরকার?
ctrl-alt-delor

@ সিটিআরএল-ওল্ট-ডেলর গো এর কোন সংস্করণ সহ? আপনার প্রকল্পের একটি go.modফাইল আছে?
ভনসি

go version go1.11.4 linux/amd64। আমি go.mod সম্পর্কে জানি না। আমি পুনঃনির্মাণ করছি https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go, এটি পুরোপুরি প্যাকেজটি তৈরি করার সাথে সাথে এটি অদ্ভুত this গোঁফ প্যাকেজ দিয়ে কীভাবে এটি ইনস্টল করা হয়নি তা আমি দেখতে পাচ্ছি না।
ctrl-alt-delor

@ সিটিআরএল-ওএলটি-ডেলর তাই কোবার বিকৃত হয় github.com/cbroglie/mustache/tree/master/cmd/mustache/vendor/… । আপনার GOPATH সঠিকভাবে সেট করা আছে?
ভনসি

আপনি ইতিমধ্যে যা পেয়েছেন তা আমি আবিষ্কার করেছি। প্যাকেজটি একজন বিক্রেতা উপ-ডিরেক্টরিতে রয়েছে: এই কারণেই এটি ইনস্টল করা হয়নি। তবে কেন জানি না কেন এটি এখন এটি নির্মাণে ইনস্টল করে না। অথবা কীভাবে বিক্রেতা ডিরেক্টরি ব্যবহার করবেন (যদি আমি এটি আমার ডিরেক্টরিতে অনুলিপি করি)।
ctrl-alt-delor 15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.