diff --git a/cmd/internal/assets/assets.go b/cmd/internal/assets/assets.go index 025052989c9b2eba73d8a9f9164bc6ccd439baf0..ceee36fb66aec40705edea676e90148a81abc18e 100644 --- a/cmd/internal/assets/assets.go +++ b/cmd/internal/assets/assets.go @@ -29,27 +29,27 @@ const ( ) // AssetsPath 返回配置资源目录 -func AssetsPath(projectData *project.Project, file string) string { - return filepath.ToSlash(filepath.Join(projectData.AssetsDir, file)) +func AssetsPath(proj *project.Project, file string) string { + return filepath.ToSlash(filepath.Join(proj.AssetsDir, file)) } // BuildOutPath 返回固定构建输出目录 $current/build -func BuildOutPath(projectData *project.Project) string { - if projectData.AppType == project.AtHelper { - return projectData.ProjectPath +func BuildOutPath(proj *project.Project) string { + if proj.AppType == project.AtHelper { + return proj.ProjectPath } - return filepath.Join(projectData.ProjectPath, "build") + return filepath.Join(proj.ProjectPath, "build") } // ReadFile // 读取文件,根据项目配置先在本地目录读取,如果读取失败,则在内置资源目录读取 -func ReadFile(projectData *project.Project, assetsFSPath, file string) ([]byte, error) { +func ReadFile(proj *project.Project, assetsFSPath, file string) ([]byte, error) { var ( content []byte err error ) - if projectData != nil { - localFilePath := AssetsPath(projectData, file) + if proj != nil { + localFilePath := AssetsPath(proj, file) content, err = os.ReadFile(localFilePath) } if errors.Is(err, fs.ErrNotExist) || content == nil { diff --git a/cmd/internal/command/command.go b/cmd/internal/command/command.go index 78ef7f85a134b6e53963b5e9eb1202f5c72c432e..05f6d940382e567aac9612809550361def2a04f3 100644 --- a/cmd/internal/command/command.go +++ b/cmd/internal/command/command.go @@ -49,8 +49,9 @@ type Install struct { } type Package struct { - Path string `short:"p" long:"path" description:"Project path, default current path. Can be configured in energy.json" default:""` - Clean bool `short:"c" long:"clean" description:"Clear configuration and regenerate the default configuration"` + Path string `short:"p" long:"path" description:"Project path, default current path. Can be configured in energy.json" default:""` + Clean bool `short:"c" long:"clean" description:"Clear configuration and regenerate the default configuration"` + Pkgbuild bool `long:"pkg" description:"Using pkgbuild to create pkg development installation packages"` } type Env struct { diff --git a/cmd/internal/package.go b/cmd/internal/package.go index 250a15cdf6ad115d40cf3b9acd5892f588ed6f33..8307e2ace2db031627fcd914fc73fafd3cf238f2 100644 --- a/cmd/internal/package.go +++ b/cmd/internal/package.go @@ -43,6 +43,7 @@ func runPackage(c *command.Config) error { return err } else { proj.Clean = c.Package.Clean + proj.Dpkg.Pkgbuild = c.Package.Pkgbuild if err = packager.GeneraInstaller(proj); err != nil { return err } diff --git a/cmd/internal/packager/pkg_app_darwin.go b/cmd/internal/packager/pkg_app_darwin.go index 7be35ba85225cabe36f19e8b99b7d1860aa1707e..755f3055dcd9bc59d15081d286f47ba4b9812af8 100644 --- a/cmd/internal/packager/pkg_app_darwin.go +++ b/cmd/internal/packager/pkg_app_darwin.go @@ -67,12 +67,14 @@ var ( macCefHelperPlugin, macCefHelpersRenderer, } + projectPath string ) func GeneraInstaller(proj *project.Project) error { appRoot := fmt.Sprintf("darwin/%s.app", proj.Name) buildOutDir := assets.BuildOutPath(proj) buildOutDir = filepath.Join(buildOutDir, appRoot) + projectPath = proj.ProjectPath if !tools.IsExist(buildOutDir) { if err := os.MkdirAll(buildOutDir, 0755); err != nil { return fmt.Errorf("unable to create directory: %w", err) @@ -96,6 +98,11 @@ func GeneraInstaller(proj *project.Project) error { if err := copyHelperFile(proj, appRoot); err != nil { return err } + if proj.Dpkg.Pkgbuild { + if err := pkgbuild(proj, appRoot); err != nil { + return err + } + } return nil } @@ -192,7 +199,36 @@ func copyFrameworkFile(proj *project.Project, appRoot string) error { if err := copyFiles(proj, cefDir, outCEF); err != nil { return err } + return nil +} +// pkgbuild --root demo.app --identifier com.demo.demo --version 1.0.0 --install-location /Applications/demo.app demo.pkg +func pkgbuild(proj *project.Project, appRoot string) error { + proj.AppType = project.AtApp + proj.ProjectPath = projectPath + buildOutDir := assets.BuildOutPath(proj) + cmdWorkDir := filepath.Join(buildOutDir, "darwin") + term.Logger.Info("Generate app pkgbuild", term.Logger.Args("cmd work dir", cmdWorkDir)) + // remove xxx.pkg + os.Remove(filepath.Join(cmdWorkDir, fmt.Sprintf("%s.pkg", proj.Name))) + cmd := command.NewCMD() + //cmd.IsPrint = false + cmd.Dir = cmdWorkDir + cmd.MessageCallback = func(bytes []byte, err error) { + msg := string(bytes) + if msg != "" { + println(msg) + } + } + var args = []string{"--root", fmt.Sprintf("%s.app", proj.Name), + "--identifier", fmt.Sprintf("com.%s.%s", proj.PList.CompanyName, proj.PList.ProductName), + "--version", proj.PList.CFBundleVersion, + "--install-location", fmt.Sprintf("/Applications/%s.app", proj.Name), + fmt.Sprintf("%s.pkg", proj.Name)} + cmd.Command("pkgbuild", args...) + cmd.Close() + // remove xxx.app + os.Remove(filepath.Join(buildOutDir, appRoot)) return nil } @@ -259,6 +295,7 @@ func createApp(proj *project.Project, appRoot string) error { term.Logger.Info("Generate app create app dir: " + appRoot) buildOutDir := assets.BuildOutPath(proj) appDir := filepath.Join(buildOutDir, appRoot) + os.Remove(appDir) // Contents contents := filepath.Join(appDir, appContents) if err := os.MkdirAll(contents, 0755); err != nil { diff --git a/cmd/internal/packager/pkg_dpkg_linux.go b/cmd/internal/packager/pkg_dpkg_linux.go index d5621d14aef2b60e5d01e873dc6333589f2dd349..e49647dd7261797199d7cc577c6f563d7c2196b0 100644 --- a/cmd/internal/packager/pkg_dpkg_linux.go +++ b/cmd/internal/packager/pkg_dpkg_linux.go @@ -116,9 +116,7 @@ func dpkgB(proj *project.Project) (string, error) { err = e } } - if tools.IsExist(outFile) { - os.Remove(outFile) - } + os.Remove(outFile) var args = []string{"-b", app, debName} cmd.Command("dpkg", args...) cmd.Close() diff --git a/cmd/internal/project/project.go b/cmd/internal/project/project.go index 6e93f456cd4273046acfcebf53f52dcd77a5475c..778c27980848c13769d0c5bef34f5c02910735b1 100644 --- a/cmd/internal/project/project.go +++ b/cmd/internal/project/project.go @@ -158,6 +158,7 @@ type DPKG struct { Compress string `json:"compress"` //压纹CEF, 当前仅支持7z/a压缩,""(空)时不启用压缩 默认: 7za UseCompress bool `json:"-"` //如果支持配置的, true=使用压缩 CompressFile string `json:"-"` //压缩后的文件完全目录 + Pkgbuild bool `json:"-"` // 生成pkg安装包 } type PList struct {