Browse Source

Allow for any number of plugins

Plugins defined in pluginSrc/ dir
Gildas Chabot 8 years ago
parent
commit
bce909a342
4 changed files with 45 additions and 9 deletions
  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
 # Compile plugins
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
 # Compile main app
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
 # Run it
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
 import (
3
 import (
4
 	"os"
4
 	"os"
5
+	"path"
5
 	"plugin"
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
 		if err != nil {
25
 		if err != nil {
12
-			panic(err)
26
+			return nil, err
13
 		}
27
 		}
14
 		sayHello, err := p.Lookup("SayHello")
28
 		sayHello, err := p.Lookup("SayHello")
15
 		if err != nil {
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