Как запускать приложение из нескольких файлов в Intllij IDEA + go-lang IDEA plugin?

670 views
Skip to first unread message

Павел Поляков

unread,
Jan 17, 2014, 5:28:29 AM1/17/14
to gola...@googlegroups.com
Добрый день,

Недавно начал изучать Go.
Установил себе IDEA + go-lang plugin по этому мануалу http://webapp.org.ua/dev/intellij-idea-and-go-plugin/ , все вроде бы работает хорошо.

Проблема:
Я могу создавать простые *.go файлы, могу делать их "Run" в IDE, и все будет работать.

Однако, для меня открытым является вопрос - как сделать "Run" для проекта который состоит из нескольких файлов?

Например, есть файл test.go

package main
import "fmt"
type Person struct {
firstName string
lastName string
}
func (person *Person) hello() {
fmt.Println("Firstname:")
fmt.Println(person.firstName)
fmt.Println("Lastname:")
fmt.Println(person.lastName)
}
func main() {
demo()
var me Person
me.firstName = "Pavel"
me.lastName = "Polyakov"
me.hello()
}

И есть файл demo.go:
package main
import "fmt"
func demo() {
fmt.Println("HI")
}

Когда я запускаю дефолтный Run на test.go, я получаю следующее:
/usr/local/go/bin/go run /Users/PavelPolyakov/IdeaProjects/src/github.com/pavelpolyakov/test/src/test.go
# command-line-arguments
src/test.go:21: undefined: demo

Что я уже делал:
1. Я могу перейти в папку /Users/PavelPolyakov/IdeaProjects/src/github.com/pavelpolyakov/test/src/ в терминале и набрать:
go run test.go demo.go
тогда все заработает
2. Я могу открыть настройки Run для test.go и в аргументы записать /Users/PavelPolyakov/IdeaProjects/src/github.com/pavelpolyakov/test/src/demo.go , тогда все так же заработает (потому что при run IDE будет подкидывать туда этот файл)

3. Делал 

go install /Users/PavelPolyakov/IdeaProjects/src/github.com/pavelpolyakov/test/src/

а затем в файле test.go прописывать 
import "github.com/pavelpolyakov/test/src/

Не помогло, $GOPATH = /Users/PavelPolyakov/IdeaProjects/

Вопрос:
Но я уверен что есть какое-то более правильное решение, подскажите плз как вы это делаете?

И дополнительный вопрос - как с помощью IDE сделать "go build" ?

Vitaliy Levchenko

unread,
Jan 17, 2014, 9:15:06 AM1/17/14
to gola...@googlegroups.com
go build можно сделать, например, добавив в вашем "Run configuration" в секции "Before launch" с помощью "Run external tool", например, shell скрипт или make build в корне проекта.

Большая трудность в том, чтобы запустить кнопкой собранный посредством go build бинарник. Раньше для этого достаточно было небольшого фикса плагина и опции запуска конфигураций через go build, но её недавно выпилили. Могу предложить вам разве что пропатчить плагин, или запускать прямо из консоли, потому как go run с одним файлом содержимое текущей директории точно не подцепит. 

пятница, 17 января 2014 г., 14:28:29 UTC+4 пользователь Павел Поляков написал:

Konstantin Cherkasoff

unread,
Jan 17, 2014, 1:29:00 PM1/17/14
to gola...@googlegroups.com
Привет!
К сожалению, плагин не позволяет установить GOPATH внутри IDEA.
Если устанавливаешь GOPATH в консоли, то нужно из той же консоли потом запускать IDEA.
Либо надо установить на всю систему в launchd.conf (судя по "/Users/PavelPolyakov/..." у тебя Mac).




--
Konstantin Cherkasoff


17 января 2014 г., 14:28 пользователь Павел Поляков <ka-z...@yandex.ru> написал:

--
Вы получили это сообщение, поскольку подписаны на группу GoLang Russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес golang-ru+...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

Igor Yurchenko

unread,
Jan 19, 2014, 4:27:49 AM1/19/14
to gola...@googlegroups.com
о мне так, правильно должно быть так:

В каталоге проекта ./test.go:

package main

import (
    "fmt"
    "./demo"
)


type Person struct {
    firstName string
    lastName  string
}

func (person *Person) hello() {
    fmt.Println("Firstname:")
    fmt.Println(person.firstName)
    fmt.Println("Lastname:")
    fmt.Println(person.lastName)
}

func main() {
    demo.Demo()

    var me Person
    me.firstName = "Pavel"
    me.lastName = "Polyakov"
    me.hello()
}

./demo/demo.go:

package demo

import "fmt"

func Demo() {
    fmt.Println("HI")
}

Так по "go run test.go" всё работает.

По вашему если в каталоге проекта все пакеты main, можете попробовать "go run *.go"... У меня в арче это тоже работает. Но это imho криво...

пятница, 17 января 2014 г., 18:28:29 UTC+8 пользователь Павел Поляков написал:

Павел Поляков

unread,
Jan 19, 2014, 11:52:04 AM1/19/14
to gola...@googlegroups.com
Всем спасибо за комментарии

2Igor Yurchenko 
Спасибо за комментарий про локал-импорт
Если сделать как вы описали, то будет работать только: go build test.go
а go build работать перестает т.к.

can't load package: /Users/PavelPolyakov/IdeaProjects/src/github.com/PavelPolyakov/test/test.go:8:2: local import "./demo" in non-local package


Вопрос в догонку
Если я хочу хранить файлы в директориях внутри проекта - как быть?
Допустим я хочу иметь что-то около MVC, и хочу хранить модели в Models.
Могу ли я обойтись без локал-импорта и пакета Models ? (если допустить у меня жгучее желание использовать go build без аргументов?)



воскресенье, 19 января 2014 г., 11:27:49 UTC+2 пользователь Igor Yurchenko написал:

Igor Yurchenko

unread,
Jan 19, 2014, 2:31:28 PM1/19/14
to gola...@googlegroups.com
Команда 'go build' без указания файла пакета main при использовании local-import и не должен работать.

Подробнее про это например в golang-nuts: https://groups.google.com/d/topic/golang-nuts/1XqcS8DuaNc/discussion

Могу лишь посоветовать не обращать внимание на это "жгучее желание" и указывать при компиляции головной файл проекта явно.
Если сомневаетесь, посмотрите как это сделано в rebel или любом другом mvc-фреймворке на go...


понедельник, 20 января 2014 г., 0:52:04 UTC+8 пользователь Павел Поляков написал:

Павел Поляков

unread,
Jan 19, 2014, 4:55:48 PM1/19/14
to gola...@googlegroups.com
Спасибо

воскресенье, 19 января 2014 г., 21:31:28 UTC+2 пользователь Igor Yurchenko написал:

Павел Поляков

unread,
Jan 21, 2014, 3:14:31 PM1/21/14
to gola...@googlegroups.com
2Igor Yurchenko и все кто знает

Еще небольшой вопрос :)

Чем отличаются следующие конструкции
import "package"
import . "package"
import _ "package" 

??

Спасибо



воскресенье, 19 января 2014 г., 23:55:48 UTC+2 пользователь Павел Поляков написал:

Konstantin Cherkasoff

unread,
Jan 21, 2014, 3:32:51 PM1/21/14
to gola...@googlegroups.com
Павел, ну все же в спеке написано четко:

--
Konstantin Cherkasoff


22 января 2014 г., 0:14 пользователь Павел Поляков <ka-z...@yandex.ru> написал:

--
Вы получили это сообщение, поскольку подписаны на группу Golang Russian.

Павел Поляков

unread,
Jan 21, 2014, 3:54:52 PM1/21/14
to gola...@googlegroups.com
Спасибо,

Ей богу я искал перед тем как спросить :) 

Спасибо за помощь

вторник, 21 января 2014 г., 22:32:51 UTC+2 пользователь Konstantin Cherkasoff написал:
Reply all
Reply to author
Forward
0 new messages