2017-05-29 54 views
1

我要動態地創建使用自定義plugins/middleware的HTTP路由器,目前,我使用的是config.yml例如:如何動態地添加進口

plugins: 
    - waf 
    - jwt 
    - cors 

解析yml文件後,我創建這樣的路線:

route := violetear.New() 
chain := middleware.New() 
for _, plugin := range Plugins { 
    chain := chain.Append(plugin)  
} 
router.Handle("/test", chain.Then(myHandler)) 
log.Fatal(http.ListenAndServe(":8080", router)) 

這個工作,我會包括在進口部所有插件,喜歡的東西:

import (
    "net/http" 

    "github.com/nbari/violetear" 
    "github.com/nbari/violetear/midleware" 

    // How to deal with this 
    "github.com/example/waf" 
    "github.com/example/jwt" 
    "github.com/example/cors" 
) 

我需要改變當前配置的格式是更有用的東西/通用大概是這樣的:

plugins: 
    - [github.com/foo, foo] 
    - [github.com/bar, bar] 

但除此之外,這可能是爲「動態」創造進口或產生最好的方法後面的代碼可以編譯?

任何想法?

回答

1

Go是一種靜態鏈接語言。這意味着如果在編譯時沒有引用程序包(源自.go源文件),那麼該程序包將不會被鏈接/編譯到可執行二進制文件中,這意味着它在運行時不可用。

所以最簡單的就是使用導入。

如果你想真正的動態配置,在1.8中引入的plugins可能是你的選擇,但使用插件會使事情複雜化,我只能用它作爲最後的手段。還要注意,插件目前只能在linux上運行。

相關問題:

Dynamic loading in Golang?

Go Plugin variable initialization

go 1.8 plugin use custom interface

+0

嗨,我一直在思考如何使用'去generate'並使用'Makefile'產生以後也許可以建立工作任何想法? – nbari

+0

@nbari是的,如果你對預處理沒問題,去生成可能是有用的,但它不會像你在問題的第一句中所要求的那樣是動態的。 – icza