修改git过滤文件
This commit is contained in:
59
cmd/devpack/commands/capture.go
Normal file
59
cmd/devpack/commands/capture.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newCaptureCmd() *cobra.Command {
|
||||
var (
|
||||
name string
|
||||
description string
|
||||
profile string
|
||||
collectors string
|
||||
filter string
|
||||
all bool
|
||||
encrypt bool
|
||||
exclude string
|
||||
tag string
|
||||
yes bool
|
||||
)
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "capture",
|
||||
Short: "捕获环境并生成 Pack",
|
||||
Long: `捕获当前开发环境的配置和工具信息,生成一个 Pack。`,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if name == "" {
|
||||
return fmt.Errorf("必须指定 Pack 名称 (--name)")
|
||||
}
|
||||
fmt.Printf("📦 Capturing environment \"%s\"...\n", name)
|
||||
// TODO: Implement capture logic
|
||||
// 1. Load profile
|
||||
// 2. Run collectors
|
||||
// 3. Write data to temp directory
|
||||
// 4. Generate manifest
|
||||
// 5. Encrypt sensitive data (if enabled)
|
||||
// 6. Create pack
|
||||
fmt.Printf("✅ Pack created: %s\n", name)
|
||||
fmt.Printf("\nRun 'devpack export %s -o %s.devpack' to export.\n", name, name)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&name, "name", "n", "", "Pack 名称(必需)")
|
||||
cmd.Flags().StringVarP(&description, "description", "d", "", "Pack 描述")
|
||||
cmd.Flags().StringVarP(&profile, "profile", "p", "", "使用指定 Profile")
|
||||
cmd.Flags().StringVarP(&collectors, "collectors", "c", "", "指定采集器(逗号分隔)")
|
||||
cmd.Flags().StringVar(&filter, "filter", "", "过滤表达式")
|
||||
cmd.Flags().BoolVar(&all, "all", false, "捕获所有可用采集器")
|
||||
cmd.Flags().BoolVar(&encrypt, "encrypt", false, "加密敏感数据")
|
||||
cmd.Flags().StringVar(&exclude, "exclude", "", "排除模式(逗号分隔)")
|
||||
cmd.Flags().StringVar(&tag, "tag", "", "标签(逗号分隔)")
|
||||
cmd.Flags().BoolVarP(&yes, "yes", "y", false, "跳过确认提示")
|
||||
|
||||
_ = cmd.MarkFlagRequired("name")
|
||||
|
||||
return cmd
|
||||
}
|
||||
45
cmd/devpack/commands/diff.go
Normal file
45
cmd/devpack/commands/diff.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newDiffCmd() *cobra.Command {
|
||||
var (
|
||||
current bool
|
||||
with string
|
||||
collectors string
|
||||
output string
|
||||
)
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "diff <pack-name>",
|
||||
Short: "对比环境差异",
|
||||
Long: `对比两个环境之间的差异。`,
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
packName := args[0]
|
||||
|
||||
if current {
|
||||
fmt.Printf("🔍 Comparing \"%s\" with current environment...\n\n", packName)
|
||||
} else if with != "" {
|
||||
fmt.Printf("🔍 Comparing \"%s\" with \"%s\"...\n\n", packName, with)
|
||||
} else {
|
||||
return fmt.Errorf("请指定对比目标: --current 或 --with <pack-name>")
|
||||
}
|
||||
|
||||
// TODO: Implement diff logic
|
||||
fmt.Println("(diff not yet implemented)")
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().BoolVar(¤t, "current", false, "与当前环境对比")
|
||||
cmd.Flags().StringVar(&with, "with", "", "与另一个 Pack 对比")
|
||||
cmd.Flags().StringVarP(&collectors, "collectors", "c", "", "只对比指定采集器")
|
||||
cmd.Flags().StringVarP(&output, "output", "o", "table", "输出格式 (table|json|yaml)")
|
||||
|
||||
return cmd
|
||||
}
|
||||
58
cmd/devpack/commands/export.go
Normal file
58
cmd/devpack/commands/export.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newExportCmd() *cobra.Command {
|
||||
var output string
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "export <pack-name>",
|
||||
Short: "导出 Pack 为文件",
|
||||
Long: `将 Pack 导出为可移植的 .devpack 文件。`,
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
packName := args[0]
|
||||
if output == "" {
|
||||
output = packName + ".devpack"
|
||||
}
|
||||
fmt.Printf("📤 Exporting \"%s\" to %s...\n", packName, output)
|
||||
// TODO: Implement export logic
|
||||
fmt.Printf("✅ Exported: %s\n", output)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&output, "output", "o", "", "输出文件路径")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
func newImportCmd() *cobra.Command {
|
||||
var (
|
||||
name string
|
||||
verify bool
|
||||
)
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "import <file-path>",
|
||||
Short: "导入 Pack 文件",
|
||||
Long: `导入 .devpack 文件到本地 Pack 存储。`,
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
filePath := args[0]
|
||||
fmt.Printf("📥 Importing %s...\n", filePath)
|
||||
// TODO: Implement import logic
|
||||
fmt.Println("✅ Import complete!")
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&name, "name", "n", "", "导入后的名称")
|
||||
cmd.Flags().BoolVar(&verify, "verify", false, "导入前验证文件完整性")
|
||||
|
||||
return cmd
|
||||
}
|
||||
39
cmd/devpack/commands/init.go
Normal file
39
cmd/devpack/commands/init.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newInitCmd() *cobra.Command {
|
||||
var (
|
||||
profile string
|
||||
template string
|
||||
force bool
|
||||
)
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "init",
|
||||
Short: "初始化 DevPack 配置",
|
||||
Long: `初始化 DevPack,创建配置目录和默认配置文件。`,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
fmt.Println("🚀 Initializing DevPack...")
|
||||
// TODO: Implement init logic
|
||||
// 1. Create ~/.devpack/ directory
|
||||
// 2. Create config.yaml
|
||||
// 3. Create profiles/ directory
|
||||
// 4. Create packs/ directory
|
||||
// 5. Create logs/ directory
|
||||
fmt.Println("✅ DevPack initialized successfully!")
|
||||
fmt.Println("\nRun 'devpack scan' to scan your current environment.")
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&profile, "profile", "p", "", "创建并使用指定名称的 Profile")
|
||||
cmd.Flags().StringVarP(&template, "template", "t", "standard", "使用预设模板 (minimal|standard|full)")
|
||||
cmd.Flags().BoolVar(&force, "force", false, "覆盖已有配置")
|
||||
|
||||
return cmd
|
||||
}
|
||||
51
cmd/devpack/commands/list.go
Normal file
51
cmd/devpack/commands/list.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newListCmd() *cobra.Command {
|
||||
var (
|
||||
output string
|
||||
detailed bool
|
||||
)
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "list [packs|profiles|collectors]",
|
||||
Short: "列出 Pack、Profile 或采集器",
|
||||
Long: `列出本地存储的 Pack、配置的 Profile 或所有可用的采集器。`,
|
||||
Args: cobra.MaximumNArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
subCmd := "packs"
|
||||
if len(args) > 0 {
|
||||
subCmd = args[0]
|
||||
}
|
||||
|
||||
switch subCmd {
|
||||
case "packs":
|
||||
fmt.Println("📦 Local Packs:")
|
||||
// TODO: List packs
|
||||
fmt.Println(" (none)")
|
||||
case "profiles":
|
||||
fmt.Println("📋 Profiles:")
|
||||
// TODO: List profiles
|
||||
fmt.Println(" (none)")
|
||||
case "collectors":
|
||||
fmt.Println("🔌 Available Collectors:")
|
||||
// TODO: List collectors
|
||||
fmt.Println(" (none)")
|
||||
default:
|
||||
return fmt.Errorf("未知的子命令: %s (可选: packs, profiles, collectors)", subCmd)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&output, "output", "o", "table", "输出格式 (table|json|yaml)")
|
||||
cmd.Flags().BoolVar(&detailed, "detailed", false, "显示详细信息")
|
||||
|
||||
return cmd
|
||||
}
|
||||
102
cmd/devpack/commands/profile.go
Normal file
102
cmd/devpack/commands/profile.go
Normal file
@@ -0,0 +1,102 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newProfileCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "profile",
|
||||
Short: "管理 Profile 配置文件",
|
||||
Long: `创建、编辑、删除和管理 Profile 配置方案。`,
|
||||
}
|
||||
|
||||
// Subcommands
|
||||
cmd.AddCommand(newProfileCreateCmd())
|
||||
cmd.AddCommand(newProfileShowCmd())
|
||||
cmd.AddCommand(newProfileListCmd())
|
||||
cmd.AddCommand(newProfileDeleteCmd())
|
||||
cmd.AddCommand(newProfileUseCmd())
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
func newProfileCreateCmd() *cobra.Command {
|
||||
var template string
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "create <name>",
|
||||
Short: "创建新 Profile",
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
name := args[0]
|
||||
fmt.Printf("📋 Creating profile \"%s\"...\n", name)
|
||||
// TODO: Create profile
|
||||
fmt.Printf("✅ Profile \"%s\" created.\n", name)
|
||||
fmt.Printf("Edit with: devpack profile edit %s\n", name)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&template, "template", "t", "standard", "模板 (minimal|standard|full)")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
func newProfileShowCmd() *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "show <name>",
|
||||
Short: "显示 Profile 内容",
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
name := args[0]
|
||||
fmt.Printf("📋 Profile: %s\n", name)
|
||||
// TODO: Show profile content
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func newProfileListCmd() *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "list",
|
||||
Short: "列出所有 Profile",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
fmt.Println("📋 Profiles:")
|
||||
// TODO: List profiles
|
||||
fmt.Println(" (none)")
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func newProfileDeleteCmd() *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "delete <name>",
|
||||
Short: "删除 Profile",
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
name := args[0]
|
||||
fmt.Printf("🗑️ Deleting profile \"%s\"...\n", name)
|
||||
// TODO: Delete profile
|
||||
fmt.Printf("✅ Profile \"%s\" deleted.\n", name)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func newProfileUseCmd() *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "use <name>",
|
||||
Short: "设置默认 Profile",
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
name := args[0]
|
||||
fmt.Printf("✅ Default profile set to \"%s\".\n", name)
|
||||
// TODO: Set default profile
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
60
cmd/devpack/commands/restore.go
Normal file
60
cmd/devpack/commands/restore.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newRestoreCmd() *cobra.Command {
|
||||
var (
|
||||
dryRun bool
|
||||
conflict string
|
||||
noRollback bool
|
||||
collectors string
|
||||
exclude string
|
||||
parallel int
|
||||
yes bool
|
||||
force bool
|
||||
)
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "restore <pack-name>",
|
||||
Short: "从 Pack 还原开发环境",
|
||||
Long: `从指定的 Pack 还原开发环境到当前系统。`,
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
packName := args[0]
|
||||
|
||||
if dryRun {
|
||||
fmt.Printf("🔍 Dry Run — Restore Plan for \"%s\"\n\n", packName)
|
||||
// TODO: Generate and display restore plan
|
||||
fmt.Println("⚠ This is a dry run. No changes were made.")
|
||||
fmt.Println("Run without --dry-run to apply these changes.")
|
||||
return nil
|
||||
}
|
||||
|
||||
fmt.Printf("🚀 Restoring environment from \"%s\"...\n", packName)
|
||||
// TODO: Implement restore logic
|
||||
// 1. Load and verify pack
|
||||
// 2. Check platform compatibility
|
||||
// 3. Detect conflicts
|
||||
// 4. Create restore point
|
||||
// 5. Execute restore plan
|
||||
// 6. Verify results
|
||||
fmt.Println("✅ Environment restored successfully!")
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().BoolVar(&dryRun, "dry-run", false, "预览更改(不实际执行)")
|
||||
cmd.Flags().StringVar(&conflict, "conflict", "prompt", "冲突处理策略 (skip|overwrite|merge|prompt|newest)")
|
||||
cmd.Flags().BoolVar(&noRollback, "no-rollback", false, "不创建还原点")
|
||||
cmd.Flags().StringVarP(&collectors, "collectors", "c", "", "只还原指定采集器")
|
||||
cmd.Flags().StringVar(&exclude, "exclude", "", "排除指定采集器")
|
||||
cmd.Flags().IntVar(¶llel, "parallel", 4, "并行还原数")
|
||||
cmd.Flags().BoolVarP(&yes, "yes", "y", false, "跳过确认提示")
|
||||
cmd.Flags().BoolVar(&force, "force", false, "强制还原")
|
||||
|
||||
return cmd
|
||||
}
|
||||
80
cmd/devpack/commands/root.go
Normal file
80
cmd/devpack/commands/root.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/user/devpack/pkg/version"
|
||||
)
|
||||
|
||||
var (
|
||||
cfgFile string
|
||||
verbose bool
|
||||
quiet bool
|
||||
logLevel string
|
||||
noColor bool
|
||||
)
|
||||
|
||||
// rootCmd represents the base command
|
||||
var rootCmd = &cobra.Command{
|
||||
Use: "devpack",
|
||||
Short: "DevPack - 开发环境打包迁移工具",
|
||||
Long: `DevPack 是一个开发环境打包迁移工具。
|
||||
它能够扫描、捕获并打包你的完整开发环境,
|
||||
在另一台同系统的电脑上一键还原。
|
||||
|
||||
让开发环境像 U 盘一样即插即用。`,
|
||||
Version: version.GetVersionString(),
|
||||
}
|
||||
|
||||
// Execute adds all child commands to the root command and sets flags appropriately.
|
||||
func Execute() error {
|
||||
return rootCmd.Execute()
|
||||
}
|
||||
|
||||
func init() {
|
||||
cobra.OnInitialize(initConfig)
|
||||
|
||||
// Global flags
|
||||
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "配置文件路径 (默认: ~/.devpack/config.yaml)")
|
||||
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "详细输出")
|
||||
rootCmd.PersistentFlags().BoolVarP(&quiet, "quiet", "q", false, "静默模式")
|
||||
rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "info", "日志级别 (trace|debug|info|warn|error)")
|
||||
rootCmd.PersistentFlags().BoolVar(&noColor, "no-color", false, "禁用彩色输出")
|
||||
|
||||
// Add subcommands
|
||||
rootCmd.AddCommand(newInitCmd())
|
||||
rootCmd.AddCommand(newScanCmd())
|
||||
rootCmd.AddCommand(newCaptureCmd())
|
||||
rootCmd.AddCommand(newRestoreCmd())
|
||||
rootCmd.AddCommand(newExportCmd())
|
||||
rootCmd.AddCommand(newImportCmd())
|
||||
rootCmd.AddCommand(newListCmd())
|
||||
rootCmd.AddCommand(newDiffCmd())
|
||||
rootCmd.AddCommand(newProfileCmd())
|
||||
rootCmd.AddCommand(newVersionCmd())
|
||||
}
|
||||
|
||||
func initConfig() {
|
||||
if cfgFile != "" {
|
||||
viper.SetConfigFile(cfgFile)
|
||||
} else {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "Error:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
viper.AddConfigPath(home + "/.devpack")
|
||||
viper.SetConfigName("config")
|
||||
viper.SetConfigType("yaml")
|
||||
}
|
||||
|
||||
viper.SetEnvPrefix("DEVPACK")
|
||||
viper.AutomaticEnv()
|
||||
|
||||
// Read config file (ignore error if not found)
|
||||
_ = viper.ReadInConfig()
|
||||
}
|
||||
44
cmd/devpack/commands/scan.go
Normal file
44
cmd/devpack/commands/scan.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func newScanCmd() *cobra.Command {
|
||||
var (
|
||||
collectors string
|
||||
category string
|
||||
profile string
|
||||
output string
|
||||
save string
|
||||
detailed bool
|
||||
)
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "scan",
|
||||
Short: "扫描当前开发环境",
|
||||
Long: `扫描当前系统的开发环境,检测已安装的工具、配置和设置。`,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
fmt.Println("🔍 Scanning development environment...")
|
||||
// TODO: Implement scan logic
|
||||
// 1. Load profile (if specified)
|
||||
// 2. Determine which collectors to run
|
||||
// 3. Run collectors in parallel
|
||||
// 4. Aggregate results
|
||||
// 5. Display results
|
||||
fmt.Println("✅ Scan complete!")
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&collectors, "collectors", "c", "", "指定采集器(逗号分隔)")
|
||||
cmd.Flags().StringVar(&category, "category", "", "按分类扫描 (runtime|package|editor|shell|git|env)")
|
||||
cmd.Flags().StringVarP(&profile, "profile", "p", "", "使用指定 Profile 的扫描配置")
|
||||
cmd.Flags().StringVarP(&output, "output", "o", "table", "输出格式 (table|json|yaml)")
|
||||
cmd.Flags().StringVar(&save, "save", "", "保存扫描结果到文件")
|
||||
cmd.Flags().BoolVar(&detailed, "detailed", false, "显示详细信息")
|
||||
|
||||
return cmd
|
||||
}
|
||||
18
cmd/devpack/commands/version.go
Normal file
18
cmd/devpack/commands/version.go
Normal file
@@ -0,0 +1,18 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/user/devpack/pkg/version"
|
||||
)
|
||||
|
||||
func newVersionCmd() *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "version",
|
||||
Short: "显示版本信息",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
fmt.Println(version.GetFullVersionInfo())
|
||||
},
|
||||
}
|
||||
}
|
||||
13
cmd/devpack/main.go
Normal file
13
cmd/devpack/main.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/user/devpack/cmd/devpack/commands"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := commands.Execute(); err != nil {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user