1
1
package build
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
5
6
"io"
6
- "io/ioutil"
7
7
"log"
8
8
"os"
9
9
"os/exec"
@@ -15,6 +15,7 @@ import (
15
15
type Binary struct {
16
16
Container string
17
17
Name string
18
+ CmdPath string
18
19
Source string
19
20
Dest string
20
21
OS string
@@ -71,12 +72,12 @@ func (bin *Binary) WriteBuild(writer io.Writer) error {
71
72
return err
72
73
}
73
74
74
- err = bin .createTempMainFile (dir )
75
+ err = bin .addAsDep (dir )
75
76
if err != nil {
76
77
return err
77
78
}
78
79
79
- err = bin .addAsDep (dir )
80
+ err = bin .createTempMainFile (dir )
80
81
if err != nil {
81
82
return err
82
83
}
@@ -86,16 +87,25 @@ func (bin *Binary) WriteBuild(writer io.Writer) error {
86
87
return err
87
88
}
88
89
89
- err = bin .quickBuildBinary (dir )
90
+ err = bin .createTempMainFile (dir )
90
91
if err != nil {
91
- log .Println ("Failed to quick build, attempting manual build" )
92
- err = bin .buildBinary (dir )
92
+ return err
93
+ }
94
+
95
+ err = nil
96
+ if ! bin .isUsingCobra (dir ) {
97
+ err = bin .quickBuildBinary (dir )
93
98
if err != nil {
94
- log .Println ("Failed to manual build as fell" )
95
- return err
99
+ log .Println ("Failed to quick build, attempting manual build" )
96
100
}
97
101
}
98
102
103
+ err = bin .buildBinary (dir )
104
+ if err != nil {
105
+ log .Println ("Failed to manual build as fell" )
106
+ return err
107
+ }
108
+
99
109
f , err := os .Open (bin .Dest )
100
110
if err != nil {
101
111
return err
@@ -146,10 +156,22 @@ func (bin *Binary) newModule(dir string) error {
146
156
147
157
func (bin * Binary ) createTempMainFile (dir string ) error {
148
158
var fileDetails strings.Builder
159
+
160
+ isCobraBuilt := bin .isUsingCobra (dir )
161
+
149
162
fileDetails .Write ([]byte ("package main\n " ))
150
- fileDetails .Write ([]byte ("import(\" " ))
151
- fileDetails .Write ([]byte (bin .Path ))
163
+ if isCobraBuilt {
164
+ fileDetails .Write ([]byte ("import( cli \" " ))
165
+ } else {
166
+ fileDetails .Write ([]byte ("import(\" " ))
167
+ }
168
+ fileDetails .Write ([]byte (bin .Path + bin .CmdPath ))
152
169
fileDetails .Write ([]byte ("\" )" ))
170
+
171
+ if isCobraBuilt {
172
+ fileDetails .Write ([]byte ("\n func main(){ cli.Run()}" ))
173
+ }
174
+
153
175
filePath := path .Join (dir , "main.go" )
154
176
file , err := os .Create (filePath )
155
177
if err != nil {
@@ -168,6 +190,20 @@ func (bin *Binary) runModTidy(dir string) error {
168
190
return command (cmd )
169
191
}
170
192
193
+ func (bin * Binary ) isUsingCobra (dir string ) bool {
194
+ modFile , err := os .ReadFile (filepath .Join (dir , "go.mod" ))
195
+
196
+ if err != nil {
197
+ return false
198
+ }
199
+
200
+ if ! bytes .Contains (modFile , []byte ("github.com/spf13/cobra" )) {
201
+ return false
202
+ }
203
+
204
+ return true
205
+ }
206
+
171
207
func (bin * Binary ) quickBuildBinary (dir string ) error {
172
208
dst , err := tempFilename ()
173
209
@@ -176,7 +212,7 @@ func (bin *Binary) quickBuildBinary(dir string) error {
176
212
}
177
213
178
214
bin .Dest = dst
179
- cmd := exec .Command ("go" , "build" , "-o" , bin .Dest , bin .Module )
215
+ cmd := exec .Command ("go" , "build" , "-o" , bin .Dest , bin .Module + bin . CmdPath )
180
216
cmd .Env = environ ()
181
217
cmd .Env = append (cmd .Env , "CGO_ENABLED=0" )
182
218
cmd .Env = append (cmd .Env , "GOOS=" + bin .OS )
@@ -214,17 +250,16 @@ func (bin *Binary) Cleanup() error {
214
250
215
251
// tempFilename returns a new temporary file name.
216
252
func tempFilename () (string , error ) {
217
- f , err := ioutil . TempFile (os .TempDir (), "goblin" )
253
+ f , err := os . MkdirTemp (os .TempDir (), "goblin" )
218
254
if err != nil {
219
255
return "" , err
220
256
}
221
- defer f .Close ()
222
- defer os .Remove (f .Name ())
223
- return f .Name (), nil
257
+ defer os .Remove (f )
258
+ return f , nil
224
259
}
225
260
226
261
func tempDirectory () (string , error ) {
227
- dir , err := ioutil . TempDir (os .TempDir (), "goblin" )
262
+ dir , err := os . MkdirTemp (os .TempDir (), "goblin" )
228
263
if err != nil {
229
264
return "" , err
230
265
}
0 commit comments