質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Q&A

解決済

1回答

2032閲覧

Go moduleのローカルパッケージに多層の依存をもたせられない

masamichi

総合スコア1

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

0グッド

0クリップ

投稿2021/02/22 15:58

編集2021/02/22 16:20

前提・実現したいこと

こちらのサイトを参考に、自分のプロジェクトを複数のパッケージに分割したいのですが、うまくいきません。
以下のようなディレクトリ構成で、AWS SAMとlambdaを使ったAPIを開発しようとしています。

├── db │ ├── db.go │ ├── go.mod │ └── go.sum ├── handler │ └── main.go ├── model │ ├── go.mod │ ├── go.sum │ └── model.go ├── go.mod ├── go.sum ├── Makefile ├── README.md └── template.yaml

そして、以下のようにdbmodelをモジュール化して、main.goではdbを使い、dbではmodelを使うような、多層の依存関係をローカルパッケージで作ろうと考えています。

  • db/go.mod
module db go 1.14 require ( github.com/aws/aws-sdk-go v1.37.15 github.com/pkg/errors v0.9.1 local.packeges/model v0.0.0-00010101000000-000000000000 ) replace local.packeges/model => ../model
  • db/db.go

Go

1package db 2 3import ( 4 "os" 5 6 "github.com/aws/aws-sdk-go/aws" 7 "github.com/aws/aws-sdk-go/aws/session" 8 "github.com/aws/aws-sdk-go/service/dynamodb" 9 "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute" 10 "github.com/pkg/errors" 11 12 "local.packeges/model" 13)
  • model/go.mod
module model go 1.14 require github.com/aws/aws-sdk-go v1.37.15
  • go.mod
module github.com/{project-name} go 1.14 require ( github.com/aws/aws-lambda-go v1.22.0 github.com/aws/aws-sdk-go v1.37.15 // indirect local.packages/db v0.0.0-00010101000000-000000000000 ) replace ( local.packages/db => ./db )
  • handler/main.go
package main import ( "encoding/json" "errors" "fmt" "io/ioutil" "net/http" "net/url" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" "local.packages/db" )

しかし、コンパイルしようとすると以下のようなエラーが発生します。

go: local.packages/db@v0.0.0-00010101000000-000000000000 requires local.packeges/model@v0.0.0-00010101000000-000000000000: unrecognized import path "local.packeges/model": https fetch: Get "https://local.packeges/model?go-get=1": dial tcp: lookup local.packeges: no such host

おそらく、dbパッケージのimport "local.packeges/model"をする際に、replaceで宣言したパスではなく、ネット上のパッケージを探しに行ってしまっているように見えます。
どのようにそれを防げるか教えていただきたいです。

試したこと

ルート直下のgo.mod

replace ( local.packages/db => ./db )

を追記してみても結果は変わりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

go.modmodule 名が整合していません。以下のようにすれば import 時のモジュール名に関してローカルのファイルを参照することができます。

module db ではなく module local.packeges/db となります。

  • db/go.mod
module local.packeges/db go 1.14 require ( github.com/aws/aws-sdk-go v1.37.15 github.com/pkg/errors v0.9.1 local.packeges/model v0.0.0-00010101000000-000000000000 ) replace local.packeges/model => ../model

model ディレクトリや直下の go.mod についても同様です。


詳細を追記しました。2021/02/26 20:16

具体例

天下り的な書き方になってしまいますが、マルチモジュール構成のリポジトリ例を記載します。

go.modmodule ディレクティブや replace ディレクティブは以下のようになります。

  • ディレクトリ構成

teratail ディレクトリがカレントディレクトリと仮定します。

. ├── db │   ├── db.go │   └── go.mod ├── go.mod ├── handler │   └── main.go └── model ├── go.mod └── model.go
  • go.mod (ディレクトリ直下)
module github.com/d-tsuji/go-sandbox/teratail go 1.14 require github.com/d-tsuji/go-sandbox/teratail/db v0.0.0-00010101000000-000000000000 replace ( github.com/d-tsuji/go-sandbox/teratail/db => ./db github.com/d-tsuji/go-sandbox/teratail/model => ./model )
  • model/go.mod
module "github.com/d-tsuji/go-sandbox/teratail/model" go 1.14
  • model/model.go

go

1package model 2 3type Person struct { 4 Name string 5}
  • db/go.mod
module "github.com/d-tsuji/go-sandbox/teratail/db" go 1.14 require ( github.com/d-tsuji/go-sandbox/teratail/model v0.0.0-00010101000000-000000000000 ) replace github.com/d-tsuji/go-sandbox/teratail/model => ../model
  • db/db.go

go

1package db 2 3import ( 4 "fmt" 5 6 "github.com/d-tsuji/go-sandbox/teratail/model" 7) 8 9func FetchHogeHoge() { 10 m := model.Person{Name: "Gopher"} 11 fmt.Printf("%+v\n", m) 12}
  • handler/main.go

go

1package main 2 3import ( 4 "github.com/d-tsuji/go-sandbox/teratail/db" 5) 6 7func main() { 8 db.FetchHogeHoge() 9}

投稿2021/02/22 23:58

編集2021/02/26 12:07
d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masamichi

2021/02/23 15:05 編集

素早いご回答ありがとうございます! ご指摘のように、`db/go.mod`に`module local.packages/db`、`model/go.mod`に`module local.packages/model`というように変えたのですが、結果は変わらず ``` Error: GoModulesBuilder:Build - Builder Failed: go: local.packages/db@v0.0.0-00010101000000-000000000000 requires local.packeges/model@v0.0.0-00010101000000-000000000000: unrecognized import path "local.packeges/model": https fetch: Get "https://local.packeges/model?go-get=1": dial tcp: lookup local.packeges: no such host ``` というエラーが起きてしまいます、、、 mainからmodelのインポートなどは可能なようなのですが、2層以上のローカルパッケージのimportは避けたほうがよいのでしょうか?
d_tutuz

2021/02/26 11:32

すみません、解決したものと思って返信遅れてしまいした。具体的な例を追記しましたので確認ください。
masamichi

2021/02/27 16:48

追記までありがとうございます!! ご提示いただいた例を参考に修正したら無事インポートできるようになりました! ご丁寧にありがとうございました! golangにまだ慣れていなく初歩的なところで詰まっていたので、非常に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問