Преглед изворни кода

Allow for any number of plugins

Plugins defined in pluginSrc/ dir
Gildas Chabot пре 8 година
родитељ
комит
bce909a342
4 измењених фајлова са 45 додато и 9 уклоњено
  1. 12 3
      buildAndRun.sh
  2. 33 6
      main.go
  3. 0 0
      pluginSrc/plugin/plugin.go
  4. 0 0
      pluginSrc/plugin2/plugin2.go

+ 12 - 3
buildAndRun.sh

@@ -4,8 +4,17 @@ set -x
4 4
 
5 5
 # Compile plugins
6 6
 
7
-(cd plugin; docker run --rm -v "$PWD":/usr/src/plugin -w /usr/src/plugin golang:1.8 go build -buildmode=plugin)
8
-(cd plugin2; docker run --rm -v "$PWD":/usr/src/plugin2 -w /usr/src/plugin2 golang:1.8 go build -buildmode=plugin)
7
+pluginSrc='pluginSrc'
8
+pluginDirs=`ls $pluginSrc`
9
+mkdir -p plugins
10
+
11
+for i in ${pluginDirs}
12
+do
13
+    fullPath=${pluginSrc}/$i
14
+    (cd $fullPath; docker run --rm -v "$PWD":/usr/src/$fullPath -w /usr/src/$fullPath golang:1.8 go build -buildmode=plugin)
15
+done
16
+
17
+mv -f `find $pluginSrc -name '*.so'` plugins/
9 18
 
10 19
 # Compile main app
11 20
 
@@ -13,4 +22,4 @@ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.8 go build
13 22
 
14 23
 # Run it
15 24
 
16
-./myapp plugin/plugin.so plugin2/plugin2.so
25
+./myapp plugins

+ 33 - 6
main.go

@@ -2,19 +2,46 @@ package main
2 2
 
3 3
 import (
4 4
 	"os"
5
+	"path"
5 6
 	"plugin"
6 7
 )
7 8
 
8
-func main() {
9
-	for _, pName := range os.Args[1:] {
10
-		p, err := plugin.Open(pName)
9
+func getPlugins(pluginDir string) ([]func(string), error) {
10
+	pDir, err := os.Open(pluginDir)
11
+	if err != nil {
12
+		return nil, err
13
+	}
14
+	pFiles, err := pDir.Readdir(0)
15
+	if err != nil {
16
+		return nil, err
17
+	}
18
+
19
+	var ret []func(string)
20
+	for _, pFile := range pFiles {
21
+		if pFile.IsDir() {
22
+			continue
23
+		}
24
+		p, err := plugin.Open(path.Join(pluginDir, pFile.Name()))
11 25
 		if err != nil {
12
-			panic(err)
26
+			return nil, err
13 27
 		}
14 28
 		sayHello, err := p.Lookup("SayHello")
15 29
 		if err != nil {
16
-			panic(err)
30
+			return nil, err
17 31
 		}
18
-		sayHello.(func(string))("Gildas")
32
+		ret = append(ret, sayHello.(func(string)))
33
+	}
34
+	return ret, nil
35
+}
36
+
37
+func main() {
38
+	pluginDir := os.Args[1]
39
+
40
+	ps, err := getPlugins(pluginDir)
41
+	if err != nil {
42
+		panic(err)
43
+	}
44
+	for _, p := range ps {
45
+		p("Gildas")
19 46
 	}
20 47
 }

plugin/plugin.go → pluginSrc/plugin/plugin.go


plugin2/plugin2.go → pluginSrc/plugin2/plugin2.go