提交 5435fa53 编写于 作者: yanghye's avatar yanghye

energy command-line tools: init, package

上级 6c3398ba
......@@ -2,19 +2,24 @@
"name": "{{.Name}}",
"projectPath": "{{.ProjectPath}}",
"frameworkPath": "{{.FrameworkPath}}",
"buildAssetsDir": "assets",
"assetsDir": "assets",
"outputFilename": "{{.OutputFilename}}",
"info": {
"icon": "icon.ico",
"installIcon": "icon.ico",
"companyName": "",
"productName": "",
"filetVersion": "1.0.0",
"icon": "{{.ProjectPath}}/resources/icon.ico",
"companyName": "{{.CompanyName}}",
"productName": "{{.ProductName}}",
"fileVersion": "1.0.0",
"productVersion": "1.0.0",
"copyright": "Copyright.........",
"copyright": "Copyright.....",
"comments": "Built using ENERGY (https://github.com/energye/energy)",
"license": "",
"language": ""
"fileDescription": "Built using ENERGY (https://github.com/energye/energy)",
"installPack": {
"icon": "{{.ProjectPath}}/resources/icon.ico",
"unIcon": "{{.ProjectPath}}/resources/icon.ico",
"license": "",
"language": "english",
"requestExecutionLevel": "admin"
}
},
"author": {
"name": "yanghy",
......
......@@ -2,20 +2,21 @@ Unicode true
!include "installer-tools.nsh"
; The version information for this two must consist of 4 parts
VIProductVersion "${INFO_PRODUCTVERSION}.0"
VIFileVersion "${INFO_PRODUCTVERSION}.0"
VIProductVersion "${INFO_ProductVersion}.0"
VIFileVersion "${INFO_FileVersion}.0"
VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}"
VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}"
VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}"
VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}"
VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
VIAddVersionKey "ProductName" "${INFO_ProductName}"
VIAddVersionKey "CompanyName" "${INFO_CompanyName}"
VIAddVersionKey "FileDescription" "${INFO_FileDescription}"
VIAddVersionKey "ProductVersion" "${INFO_ProductVersion}"
VIAddVersionKey "FileVersion" "${INFO_FileVersion}"
VIAddVersionKey "LegalCopyright" "${INFO_Copyright}"
!include "MUI2.nsh"
!define MUI_ICON "..\icon.ico"
!define MUI_UNICON "..\icon.ico"
!define MUI_ICON "${INFO_Icon}" ;"..\icon.ico"
!define MUI_UNICON "${INFO_UnIcon}" ;"..\icon.ico"
; !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
!define MUI_ABORTWARNING # This will warn the user if they exit from the installer.
......@@ -26,8 +27,8 @@ VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
; LICENSE Page
!ifdef ARG_ENERGY_PAGE_LICENSE
!insertmacro MUI_PAGE_LICENSE "${ARG_ENERGY_PAGE_LICENSE}" # Add a LICENSE page to the installer
!ifdef ENERGY_PAGE_LICENSE
!insertmacro MUI_PAGE_LICENSE "${ENERGY_PAGE_LICENSE}" # Add a LICENSE page to the installer
!endif
!insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
......@@ -42,9 +43,9 @@ VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
;!uninstfinalize 'signtool --file "%1"'
;!finalize 'signtool --file "%1"'
Name "${INFO_PRODUCTNAME}"
OutFile ".\${INFO_PROJECTNAME}-installer.exe" # Name of the installer's file.
InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
Name "${INFO_ProductName}"
OutFile ".\${INFO_ProjectName}-installer.exe" # Name of the installer's file.
InstallDir "$PROGRAMFILES64\${INFO_CompanyName}\${INFO_ProductName}" # Default installing folder ($PROGRAMFILES is Program Files folder).
ShowInstDetails show # This will always show the installation details.
Function .onInit
......@@ -57,8 +58,8 @@ Section
!insertmacro energy.files
CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
CreateShortcut "$SMPROGRAMS\${INFO_ProductName}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
CreateShortCut "$DESKTOP\${INFO_ProductName}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
!insertmacro energy.writeUninstaller
SectionEnd
......@@ -70,8 +71,8 @@ Section "uninstall"
RMDir /r $INSTDIR
Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
Delete "$SMPROGRAMS\${INFO_ProductName}.lnk"
Delete "$DESKTOP\${INFO_ProductName}.lnk"
!insertmacro energy.deleteUninstaller
SectionEnd
......@@ -4,45 +4,35 @@
!include "WinVer.nsh"
!include "FileFunc.nsh"
!ifndef INFO_PROJECTNAME
!define INFO_PROJECTNAME "{{.Name}}"
!endif
!ifndef INFO_COMPANYNAME
!define INFO_COMPANYNAME "{{.Info.CompanyName}}"
!endif
!ifndef INFO_PRODUCTNAME
!define INFO_PRODUCTNAME "{{.Info.ProductName}}"
!endif
!ifndef INFO_PRODUCTVERSION
!define INFO_PRODUCTVERSION "{{.Info.ProductVersion}}"
!endif
!ifndef INFO_COPYRIGHT
!define INFO_COPYRIGHT "{{.Info.Copyright}}"
!endif
!ifndef PRODUCT_EXECUTABLE
!define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
!endif
!ifndef UNINST_KEY_NAME
!define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
!endif
!define INFO_ProjectName "{{.Name}}"
!define INFO_CompanyName "{{.Info.CompanyName}}"
!define INFO_ProductName "{{.Info.ProductName}}"
!define INFO_FileVersion "{{.Info.FileVersion}}"
!define INFO_ProductVersion "{{.Info.ProductVersion}}"
!define INFO_FileDescription "{{.Info.FileDescription}}"
!define INFO_Copyright "{{.Info.Copyright}}"
!define PRODUCT_EXECUTABLE "${INFO_ProjectName}.exe"
!define UNINST_KEY_NAME "${INFO_CompanyName}${INFO_ProductName}"
!define INFO_Icon "{{.Info.InstallPack.Icon}}"
!define INFO_UnIcon "{{.Info.InstallPack.UnIcon}}"
!define ENERGY_LANGUAGE "{{.Info.InstallPack.Language}}"
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"
!ifndef REQUEST_EXECUTION_LEVEL
!define REQUEST_EXECUTION_LEVEL "admin"
!endif
{{if .Info.InstallPack.License}}
!define ENERGY_PAGE_LICENSE "{{.Info.InstallPack.License}}" ; license.txt path
{{end}}
RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
{{if .Info.InstallPack.RequestExecutionLevel}}
!define REQUEST_EXECUTION_LEVEL "{{.Info.InstallPack.RequestExecutionLevel}}"
RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}" ; admin or ""
{{end}}
!ifdef ARG_ENERGY_LANGUAGE
!define ENERGY_LANGUAGE "${ARG_ENERGY_LANGUAGE}" # customer
!else
!define ENERGY_LANGUAGE "English" # default
!endif
!macro energy.files
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_ENERGY_BINARY}" ; energy app.exe path, ..\..\app.exe
;File /r "${ARG_ENERGY_CEF_FRAMEWORK}" ; cef framework path, ENERGY_HOME=/to/cef/path
File "/oname=${PRODUCT_EXECUTABLE}" "{{.ProjectPath}}\{{.Name}}.exe" ; app.exe path, ..\..\app.exe
;File /r "{{.FrameworkPath}}" ; cef framework path, ENERGY_HOME=/to/cef/path
!macroend
......@@ -50,9 +40,9 @@ RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
WriteUninstaller "$INSTDIR\uninstall.exe"
SetRegView 64
WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_CompanyName}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_ProductName}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_ProductVersion}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
......
......@@ -41,7 +41,8 @@ type Install struct {
}
type Package struct {
Path string `short:"p" long:"path" description:"project path"`
Path string `short:"p" long:"path" description:"Project path, default current path. Can be configured in energy.json"`
Clean bool `short:"c" long:"clean" description:"Clear configuration and regenerate the default configuration"`
}
type Env struct {
......
......@@ -33,15 +33,14 @@ func InitEnergyProject(c *command.Config) error {
}
println()
println("Successfully initialized the energy application project:", c.Init.Name)
println()
println(" Run Application: go run main.go")
println(` Building Applications:
Use GO: go build -ldflags "-s -w"
Use Energy: energy build .
`)
println(` website:
https://github.com/energye/energy
https://energy.yanghy.cn
`)
println(" Run Application: go run main.go")
println(` Building Application:
Use GO: go build -ldflags "-s -w"
Use Energy: energy build .
`)
return nil
}
......@@ -88,11 +87,14 @@ func generaProject(c *command.Config) error {
return nil
}
// 创建 energy.json template
// 默认配置
data := make(map[string]any)
data["Name"] = c.Init.Name
data["ProjectPath"] = filepath.ToSlash(projectPath)
data["OutputFilename"] = c.Init.Name
data["FrameworkPath"] = filepath.ToSlash(os.Getenv(consts.EnergyHomeKey))
data["OutputFilename"] = c.Init.Name
data["CompanyName"] = c.Init.Name
data["ProductName"] = c.Init.Name
if err := createFile("assets/energy.json", consts.EnergyProjectConfig, data); err != nil {
return err
}
......
......@@ -17,10 +17,11 @@ import (
)
var CmdPackage = &command.Command{
UsageLine: "package -p [path]",
UsageLine: "package -p [path] -c [clean]",
Short: "Making an Installation Package",
Long: `
-p project path, default current path. Can be configured in energy.json
-p Project path, default current path. Can be configured in energy.json
-c Clear configuration and regenerate the default configuration
. Execute default command
Making an Installation Package
......
//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under Apache License Version 2.0, January 2004
//
// https://www.apache.org/licenses/LICENSE-2.0
//
//----------------------------------------
package packager
const (
assetsFSPath = "assets/packager/"
)
......@@ -17,7 +17,6 @@ import (
"errors"
"fmt"
"github.com/energye/energy/v2/cmd/internal/assets"
"github.com/energye/energy/v2/cmd/internal/consts"
"github.com/energye/energy/v2/cmd/internal/project"
"github.com/energye/energy/v2/cmd/internal/tools"
"github.com/energye/golcl/tools/command"
......@@ -52,7 +51,7 @@ func windows(projectData *project.Project) error {
return fmt.Errorf("unable to create directory: %w", err)
}
}
// 生成安装生成配置文件
// 生成安装生成配置文件 nsis.nsi
if nsisData, err := readFile(projectData, windowsNsis); err != nil {
return err
} else {
......@@ -60,12 +59,15 @@ func windows(projectData *project.Project) error {
return err
}
}
// tools.nsh
if toolsData, err := readFile(projectData, windowsNsisTools); err != nil {
return err
} else {
data := make(map[string]any)
data["Name"] = projectData.Name
data["Info"] = projectData.Info
data["ProjectPath"] = filepath.FromSlash(projectData.ProjectPath)
data["FrameworkPath"] = filepath.FromSlash(projectData.FrameworkPath)
data["Info"] = projectData.Info.FromSlash()
if content, err := tools.RenderTemplate(string(toolsData), data); err != nil {
return err
} else if err = writeFile(projectData, windowsNsisTools, content); err != nil {
......@@ -86,37 +88,37 @@ func makeNSIS(projectData *project.Project) error {
}
nsisScriptPath := filepath.Join(buildOutPath(projectData), windowsNsis)
var binary string
if consts.IsWindows {
binary = filepath.Join(projectData.ProjectPath, projectData.Name+".exe")
} else {
binary = filepath.Join(projectData.ProjectPath, projectData.Name)
}
//var binary string
//if consts.IsWindows {
// binary = filepath.Join(projectData.ProjectPath, projectData.Name+".exe")
//} else {
// binary = filepath.Join(projectData.ProjectPath, projectData.Name)
//}
args = append(args, "-DARG_ENERGY_BINARY="+binary)
if projectData.Info.License != "" {
// 授权信息文本目录: ..\LICENSE.txt
args = append(args, "-DARG_ENERGY_PAGE_LICENSE="+projectData.Info.License)
}
if projectData.Info.Language != "" {
// default English
// 可选多种语言: SimpChinese, 参考目录: NSIS\Contrib\Language files
args = append(args, "-DARG_ENERGY_LANGUAGE="+projectData.Info.Language)
}
//框架目录
args = append(args, "-DARG_ENERGY_CEF_FRAMEWORK="+projectData.FrameworkPath)
//args = append(args, "-DARG_ENERGY_BINARY="+binary)
//if projectData.Info.InstallPack.License != "" {
// // 授权信息文本目录: ..\LICENSE.txt
// args = append(args, "-DARG_ENERGY_PAGE_LICENSE="+projectData.Info.License)
//}
//if projectData.Info.Language != "" {
// // default English
// // 可选多种语言: SimpChinese, 参考目录: NSIS\Contrib\Language files
// args = append(args, "-DARG_ENERGY_LANGUAGE="+projectData.Info.Language)
//}
////框架目录
//args = append(args, "-DARG_ENERGY_CEF_FRAMEWORK="+projectData.FrameworkPath)
args = append(args, nsisScriptPath)
cmd.Command("makensis", args...)
return nil
}
// 返回根据配置的资源目录
// 返回配置资源目录
func assetsPath(projectData *project.Project, file string) string {
return filepath.ToSlash(filepath.Join(projectData.BuildAssetsDir, file))
return filepath.ToSlash(filepath.Join(projectData.AssetsDir, file))
}
// 返回固定构建输出目录 $current/build
// 返回固定构建输出目录 $current/build
func buildOutPath(projectData *project.Project) string {
return filepath.Join(projectData.ProjectPath, "build")
}
......@@ -127,13 +129,10 @@ func readFile(projectData *project.Project, file string) ([]byte, error) {
localFilePath := assetsPath(projectData, file)
content, err := os.ReadFile(localFilePath)
if errors.Is(err, fs.ErrNotExist) {
content, err = assets.ReadFile(localFilePath)
content, err = assets.ReadFile(assetsFSPath + file)
if err != nil {
return nil, err
}
if err := writeFile(projectData, file, content); err != nil {
return nil, fmt.Errorf("unable to create file in build folder: %s", err)
}
return content, nil
}
......@@ -149,9 +148,9 @@ func writeFile(projectData *project.Project, file string, content []byte) error
}
}
targetPath := filepath.Join(buildOutDir, file)
if !tools.IsExist(filepath.Dir(targetPath)) {
if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil {
return fmt.Errorf("unable to create directory: %w", err)
if !projectData.Clean {
if tools.IsExist(targetPath) {
return nil
}
}
if err := os.WriteFile(targetPath, content, 0644); err != nil {
......
......@@ -22,10 +22,11 @@ import (
// Project holds the data related to a ENERGY project
type Project struct {
Clean bool `json:"-"` // 清空配置重新生成
Name string `json:"name"` // 应用名称
ProjectPath string `json:"projectPath"` // 项目目录
FrameworkPath string `json:"frameworkPath"` // 框架目录 未指定时使用环境变量 ENERGY_HOME
BuildAssetsDir string `json:"buildAssetsDir"` // 构建配置所在目录 未指定使用田默认内置配置
AssetsDir string `json:"assetsDir"` // 构建配置所在目录 未指定使用田默认内置配置
OutputFilename string `json:"outputFilename"` // 输出安装包文件名
Info Info `json:"info"` // 应用信息
Author Author `json:"author"` // 作者信息
......@@ -44,8 +45,8 @@ func (m *Project) setDefaults() {
if !tools.IsExist(m.FrameworkPath) {
panic("energy framework directory does not exist: " + m.FrameworkPath)
}
if m.BuildAssetsDir == "" {
m.BuildAssetsDir = "assets"
if m.AssetsDir == "" {
m.AssetsDir = "assets"
}
if m.OutputFilename == "" {
m.OutputFilename = m.Name
......@@ -69,9 +70,9 @@ func (m *Project) setDefaults() {
v := "Copyright........."
m.Info.Copyright = &v
}
if m.Info.Comments == nil {
if m.Info.FileDescription == nil {
v := "Built using ENERGY (https://github.com/energye/energy)"
m.Info.Comments = &v
m.Info.FileDescription = &v
}
switch runtime.GOOS {
case "windows":
......@@ -84,24 +85,56 @@ func (m *Project) setDefaults() {
}
type Info struct {
Icon string `json:"icon"` //应用图标
CompanyName string `json:"companyName"` //公司名称
ProductName string `json:"productName"` //产品名称
FileVersion string `json:"FileVersion"` //文件版本
ProductVersion string `json:"productVersion"` //产品版本
Copyright *string `json:"copyright"` //版权
Comments *string `json:"comments"` //exe详情描述
FileDescription *string `json:"fileDescription"` //描述
InstallPack InstallPack `json:"installPack"` // windows nsis 安装包
}
func (m *Info) FromSlash() *Info {
m.Icon = filepath.FromSlash(m.Icon)
m.InstallPack = *m.InstallPack.FromSlash()
return m
}
func (m *Info) ToSlash() *Info {
m.Icon = filepath.ToSlash(m.Icon)
m.InstallPack = *m.InstallPack.ToSlash()
return m
}
func (m *InstallPack) FromSlash() *InstallPack {
m.Icon = filepath.FromSlash(m.Icon)
m.UnIcon = filepath.FromSlash(m.UnIcon)
return m
}
func (m *InstallPack) ToSlash() *InstallPack {
m.Icon = filepath.ToSlash(m.Icon)
m.UnIcon = filepath.ToSlash(m.UnIcon)
return m
}
// InstallPack windows NSIS
type InstallPack struct {
Icon string `json:"icon"` //安装包图标
UnIcon string `json:"unIcon"` //安装包卸载图标
License string `json:"license"` //安装包授权信息,(license.txt)文件路径
Language string `json:"language"` //安装包语言, 中文: SimpChinese, 英文: English, 语言在 NSIS_HOME/Contrib/Language files
RequestExecutionLevel string `json:"requestExecutionLevel"` // admin or ""
}
type Author struct {
Name string `json:"name"`
Email string `json:"email"`
}
type Info struct {
Icon string `json:"icon"` //应用图标
InstallIcon string `json:"installIcon"` //应用包装图标
CompanyName string `json:"companyName"` //公司名称
ProductName string `json:"productName"` //产品名称
FiletVersion string `json:"filetVersion"` //文件版本
ProductVersion string `json:"productVersion"` //产品版本
Copyright *string `json:"copyright"` //版权
Comments *string `json:"comments"` //描述
License string `json:"license"` //安装包授权信息,(license.txt)文件路径
Language string `json:"language"` //安装包语言, 中文: SimpChinese, 英文: English, 语言在 NSIS_HOME/Contrib/Language files
}
// APP项目配置转换到Project
func parse(projectData []byte) (*Project, error) {
m := &Project{}
......@@ -127,6 +160,9 @@ func NewProject(projectPath string) (*Project, error) {
if err != nil {
return nil, err
}
m.ProjectPath = projectPath
if m.ProjectPath == "" {
m.ProjectPath = projectPath
}
m.ProjectPath = filepath.FromSlash(m.ProjectPath)
return m, nil
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册