Як скомпілювати програму Go, що складається з декількох файлів?


88

У мене є невелика програма, яка складається з трьох файлів, всі вони належать одному пакету (main), але коли я роблю "go build main.go", збірка не вдається. Коли це був лише один файл (main.go), все працювало нормально. Тепер, коли я доклав певних зусиль, щоб відокремити код, схоже, компілятор не може знайти матеріали, вилучені з main.go та поміщені в ці два інших файли (які знаходяться в тому ж каталозі, що і main.go) . Що призводить до помилок "невизначеного типу".

Як скомпілювати цю програму, що складається з декількох файлів?

Відповіді:


86

Новий спосіб ( рекомендується ):

Погляньте, будь ласка, на цю відповідь .

Старий спосіб:

Припустимо, ви пишете програму під назвою myprog:

Помістіть усі файли в такий каталог

myproject/go/src/myprog/xxx.go

Потім додайте myproject/goдо GOPATH

І біжи

go install myprog

Таким чином ви зможете додавати інші пакети та програми в myproject / go / src, якщо хочете.

Довідково: http://golang.org/doc/code.html

(цей документ завжди пропускають новачки, і він спочатку часто незрозумілий. Він повинен отримати найбільшу увагу команди Go IMO)


5
чому б не позбутися / go / і просто зробити myproject / src?
Олександр Міллз,

також, я припускаю, що "go install myprog" якось пише джерело проекту в розташування $ GOPATH? Це так? якщо так, то непогано було б також пояснити це пояснення як частину відповіді
Олександр Міллс,

1
@AlexanderMills Тільки невеликі проекти використовують лише одну технологію.
Denys Séguret

2
@ DenysSéguret не впевнений, що я з цим погоджуюсь, але в будь-якому випадку це стосується простих проектів, ви можете просто відмовитись від участі в переході - люди можуть припустити, що річ go є необхідною, а це ні. Ви скажіть мені, що простіше: ходити чи не ходити? :)
Олександр Міллс

1
Я досі не розумію, чому ця структура папок?
Madeo

67

Коли ви відокремлюєте код від, main.goнаприклад more.go, ви просто передаєте цей файл також go build/ go run/ go install.

Тож якщо ви раніше бігали

go build main.go

ти тепер просто

go build main.go more.go

Як додаткова інформація:

go build --help

заявляє:

Якщо аргументами є список файлів .go, build розглядає їх як список вихідних файлів із зазначенням одного пакета.


Зауважте, що go buildі go installвідрізняються від go runтого, що перші два стану очікують імен пакунків як аргументи, тоді як останній очікує файлів go . Однак перші два також прийматимуть файли go, як це робить go install.

Якщо вам цікаво: build створить лише buildпакети / файли, installстворить об'єктні та двійкові файли у вашому GOPATH, а runтакож скомпілює та запустить вашу програму.


6
Якщо ви не хочете продовжувати додавати все більше і більше файлів, використовуйте регулярний вираз із: go run *
.go

добре, дякую, Go завжди виписує лише один виконуваний файл? Він не тримає виконувані файли окремо (як у Java)?
Олександр Міллс,

@AlexanderMills через вікна, я думаю, використовуй nix. або принаймні mingw.
Сергій Горланов

так, я використовував MacOS, але, можливо, це Bash версія 3, що збивається, я повинен перейти на Bash 4.
Alexander Mills

30

Ви також можете просто бігти

go build

у папці вашого проекту myproject / go / src / myprog

Тоді ви можете просто набирати текст

./myprog

щоб запустити програму


3
вихід - це об'єкт go, а не виконуваний файл.
user2284570

@ user2284570 просто додайте chmod +xдозвіл для запуску цього файлу
dalmate

19

Оскільки Go 1.11+, GOPATH більше не рекомендується, новий спосіб - використання модулів Go.

Скажімо, ви пишете програму під назвою simple:

  1. Створіть каталог:

    mkdir simple
    cd simple
    
  2. Створіть новий модуль:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. Помістіть усі файли в цей каталог.

  4. Нарешті, запустіть:

    go run .
    
  5. Крім того, ви можете створити виконувану програму, побудувавши її:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

Для отримання додаткової інформації ви можете прочитати це .

Go включає підтримку версійних модулів, як пропонується тут, з 1.11. Початковий прототип vgo був оголошений у лютому 2018 року. У липні 2018 року модулі версій потрапили в основне сховище Go. У Go 1.14 підтримка модулів вважається готовою до виробничого використання, і всім користувачам пропонується перейти на модулі з інших систем управління залежностями.


7

Можна використовувати

go build *.go 
go run *.go

обидва будуть працювати, також ви можете використовувати

go build .
go run .

5

Це залежить від вашої структури проекту. Але найпростішим є:

go build ./... -o ./myproject

то біжи ./myproject.

Припустимо, структура вашого проекту виглядає так

- hello
|- main.go

тоді ви просто переходите до каталогу проекту та запускаєте

go build -o ./myproject

потім запустіть ./myprojectна оболонці.

або

# most easiest; builds and run simultaneously
go run main.go

припустимо, ваш основний файл вкладений у підкаталог, такий як cmd

- hello
|- cmd
 |- main.go

тоді ти побіжиш

go run cmd/main.go

3

Так! Це дуже прямо вперед, і ось тут починає діяти стратегія пакету. Є три шляхи до мого знання. структура папок:

Попередження GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2: адаптер може містити лише основні пакунки та каталоги sun

  1. перейдіть до папки "адаптер". Виконати:
    go build main.go
  1. перейдіть до папки "адаптер". Виконати:
    go build main.go
  1. перейдіть до GOPATH / src розпізнати відносний шлях до основного пакета, тут "myproject / adapter". Виконати:
    go build myproject/adapter

exe-файл буде створений у каталозі, в якому ви перебуваєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.