2014-06-09 4 views
8

이동이 비교적 쉽습니다. 확장 가능한 응용 프로그램을위한 디자인 패턴이 있다면 궁금합니다.Golang 자동 확장 응용 프로그램

예를 들어, 내 소스에는 프로그램을위한 다른 응용 프로그램 특정 확장을 배치하는 확장 디렉토리가 있습니다. 현재 각각의 주요 기능을 개별적으로 이름별로로드합니다. 나는 프로그램이 컴파일 될 때 자동으로 내 확장을 포함하게하고 싶습니다.

그냥 명확히 말하면 런타임에 확장을 동적으로로드하려고하지는 않습니다. 이 후, 내가 만들어 줄게 단지 이동과 할 수없는 경우

  1. 드롭 파일 확장자 폴더에
  2. 다시 컴파일

: 난 그냥 프로그램에 확장을 추가하는 등 간단하게 만들 싶습니다 만기가되었지만, 나는 이것을하기위한 더 좋은 방법이되어야한다고 생각하고 있습니다.

더 명확 내가 더 간단하게 원하는 것을 보여주기 위해 여기에 내가 지금 무엇의 예입니다

main.go

package main 

import (
    "github.com/go-martini/martini" 
    "gopath/project/extensions" 
) 

func main() { 
    app := martini.Classic() 

    // Enable Each Extension 
    app.Router.Group("/example", extensions.Example) 
// app.Router.Group("/example2", extensions.Example2) 
// ... 


    app.Run() 
} 

확장/example.go

package extensions 

import (
    "github.com/codegangsta/martini-contrib/render" 
    "github.com/go-martini/martini" 
) 

func Example(router martini.Router) { 
    router.Get("", func(r render.Render) { 
     // respond to query 
     r.JSON(200, "") 
    }) 
} 
+0

에 저장되며 모듈 경로의 하위 디렉토리에 패키지를 저장하고 하위 모듈을 main으로 가져옵니다. 그러나 모든 '확장'에 표준 패키지 이름을 추가하고 이름 충돌 등을 처리해야합니다. 악몽 : D – fabrizioM

+0

또 다른 접근법은 Packer처럼 RPC를 사용하는 것입니다. http://www.packer.io/docs /extend/developing-plugins.html – elithrar

답변

4

각 확장명 파일에 init 메서드를 사용하여 확장명을 등록하십시오.

그래서 plugin1.go에서 당신은

func init() { 
    App.Router.Group("/example", extensions.Example) 
} 

당신은 app 공개로 설정해야 거라고 쓸 것입니다.

대신 주 코드에서 등록 기능을 사용할 수 있습니다.

rclone : Here is the registration functionhere is an example of it being called에이 기술을 사용합니다. 모듈은 각각 by including them in the main pacakge

+1

감사합니다. init 패키지가 Go 패키지에 존재한다는 사실을 완전히 잊어 버렸습니다. – KayoticSully