开发小工具:提取fastadmin项目中属于某个插件的文件并拷贝到 addons/[插件名] 目录,便于打包插件。

<?php
/**
 * http://welfaredelivery.wpygo.com/tool.php
 * 
 * 开发小工具:提取fastadmin项目中属于某个插件的文件并拷贝到 addons/[插件名] 目录,便于打包插件。
 *
 * 功能说明:
 * - 只检查 application 和 public 目录
 * - 只根据文件路径判断是否包含插件名称
 * - 特殊处理 /public/assets/addons/[插件名] 目录中的文件,将其复制到插件的 assets 目录
 * - 支持 --dry-run 模式,只列出将要拷贝的文件
 * 
 * 打包文档:https://doc.fastadmin.net/developer/78.html#toc-3
 * 下面是打包命令
 * cd D:\www\welfaredelivery.wpygo.com
 * D:\php-7.4.33-Win32-vc15-x64\php think addon -a welfaredelivery -c package
 */

$plugin = "welfaredelivery"; // 默认插件名
$root = "D:\www\welfaredelivery.wpygo.com"; // 项目根目录

$destBase = $root . DIRECTORY_SEPARATOR . 'addons' . DIRECTORY_SEPARATOR . $plugin;

// 只检查下面的目录
$checkDirs = [
    'application',
    'public'
];

$copied = 0;
$candidates = [];

echo "正在项目中搜索插件 '{$plugin}' ...\n";

foreach ($checkDirs as $checkDirName) {
    $checkDir = $root . DIRECTORY_SEPARATOR . $checkDirName;
    
    if (!is_dir($checkDir)) {
        echo "跳过 {$checkDir} (目录不存在)\n";
        continue;
    }
    
    echo "正在扫描 {$checkDir}...\n";
    
    $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($checkDir, RecursiveDirectoryIterator::SKIP_DOTS));
    foreach ($rii as $file) {
        $filePath = $file->getPathname();

        // 只处理文件
        if (!$file->isFile()) continue;

        $relPath = ltrim(str_replace($root, '', $filePath), DIRECTORY_SEPARATOR);

        // 只根据路径判断是否包含插件名
        if (stripos($relPath, $plugin) !== false) {
            $candidates[] = $relPath;
        }
    }
}

// 特殊处理 /public/assets/addons/[插件名] 目录
$assetsAddonDir = 'public' . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR . 'addons' . DIRECTORY_SEPARATOR . $plugin;
$assetsAddonPath = $root . DIRECTORY_SEPARATOR . $assetsAddonDir;

if (is_dir($assetsAddonPath)) {
    echo "正在扫描 {$assetsAddonPath}...\n";
    
    $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($assetsAddonPath, RecursiveDirectoryIterator::SKIP_DOTS));
    foreach ($rii as $file) {
        $filePath = $file->getPathname();

        // 只处理文件
        if (!$file->isFile()) continue;

        $relPath = ltrim(str_replace($root, '', $filePath), DIRECTORY_SEPARATOR);
        
        // 将文件添加到候选列表中
        $candidates[] = $relPath;
    }
}

if (empty($candidates)) {
    echo "未找到与插件 '{$plugin}' 相关的文件。\n";
    exit(0);
}

echo "找到 " . count($candidates) . " 个候选文件需要复制。\n";

// 创建目标基础目录
if (!$dryRun && !is_dir($destBase)) {
    mkdir($destBase, 0777, true);
    echo "创建目录: {$destBase}\n";
}

foreach ($candidates as $relPath) {
    $source = $root . DIRECTORY_SEPARATOR . $relPath;
    // 特殊处理 /public/assets/addons/[插件名] 路径
    if (strpos($relPath, 'public' . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR . 'addons' . DIRECTORY_SEPARATOR . $plugin) === 0) {
        // 将 /public/assets/addons/[插件名]/* 映射到 /addons/[插件名]/assets/*
        $relativeAssetPath = substr($relPath, strlen('public' . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR . 'addons' . DIRECTORY_SEPARATOR . $plugin));
        $target = $destBase . DIRECTORY_SEPARATOR . 'assets' . $relativeAssetPath;
    } else {
        $target = $destBase . DIRECTORY_SEPARATOR . $relPath;
    }
    
    $targetDir = dirname($target);
    
    if (!is_dir($targetDir)) {
        if ($dryRun) {
            echo "[预览模式] 将创建目录: {$targetDir}\n";
        } else {
            @mkdir($targetDir, 0777, true);
            echo "创建目录: {$targetDir}\n";
        }
    }
    
    if ($dryRun) {
        echo "[预览模式] 将复制: {$source} -> {$target}\n";
    } else {
        if (@copy($source, $target)) {
            echo "已复制: {$source} -> {$target}\n";
            $copied++;
        } else {
            echo "复制失败: {$source} -> {$target}\n";
        }
    }
}

if ($dryRun) {
    echo "预览模式完成。" . count($candidates) . " 个文件将被复制。\n";
} else {
    echo "完成。共复制 {$copied} 个文件到 {$destBase}。\n";
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值