寫了個指令碼,下載discuzQ,並解壓到指定 git 倉儲下,方便更新程式碼。
遇到一個問題,在解壓 uniapp 這個zip包時,裡面多了一層目錄包裝,如果直接解壓到指定目錄,也會造成多了一級目錄,如下圖:
那如何從zip包裡解壓,並去掉多餘一層的目錄 uniapp_v2.xxxx
,可以看下面的 copy("zip://{$zipFile}#{$filename}", $newFileName);
<?php
set_time_limit(0);
$config = (object)[
'zips' => __DIR__ . '/zips',
'uniapp' => __DIR__ . '/uniapp',
];
downloadAndExtract('https://dl.discuz.chat/uniapp_latest.zip', 'uniapp');
function downloadAndExtract($zipUrl, $key)
{
global $config;
echo "正在下載: $zipUrl\n";
$zipData = file_get_contents($zipUrl);
$zipFile = $config->zips . "/$key-" . date('Ymd-His') . '.zip';
file_put_contents($zipFile, $zipData);
echo "正在解壓到 {$config->$key} \n";
$zip = new ZipArchive;
if ($key === 'uniapp') {
if ($zip->open($zipFile) === true) {
$folder = $zip->getNameIndex(0);
for ($i = 1; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
if (substr($filename, -1, 1) === '/') {
continue;
}
// $folder like => uniapp_v2.1.201029/
// $filename like => uniapp_v2.1.201029/commitlint.config.js
$newFileName = $config->$key . '/' . str_replace($folder, '', $filename);
if (!file_exists(dirname($newFileName))) {
mkdir(dirname($newFileName), 0644, true);
}
copy("zip://{$zipFile}#{$filename}", $newFileName);
}
$zip->close();
}
}
echo "-------------- SUCESS --------------\n";
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結