const fs = require('fs')
|
const path = require('path')
|
const {
|
compileI18nJsonStr
|
} = require('@dcloudio/uni-i18n')
|
const {
|
normalizePath
|
} = require('@dcloudio/uni-cli-shared')
|
const {
|
initI18nOptions
|
} = require('@dcloudio/uni-cli-shared/lib/i18n')
|
const assetsDir = 'static'
|
const CopyWebpackPluginVersion = Number(require('copy-webpack-plugin/package.json').version.split('.')[0])
|
|
function getAssetsCopyOption (from, options = {}) {
|
if (path.isAbsolute(from)) {
|
if (fs.existsSync(from)) {
|
return Object.assign({
|
from,
|
to: path.resolve(process.env.UNI_OUTPUT_DIR)
|
},
|
options
|
)
|
}
|
}
|
const to = from
|
from = path.resolve(process.env.UNI_INPUT_DIR, from)
|
if (fs.existsSync(from)) {
|
return Object.assign({
|
from,
|
to: path.resolve(process.env.UNI_OUTPUT_DIR, to)
|
},
|
options
|
)
|
}
|
}
|
|
function addIgnore (ignore, assetsDir, platform, ignoreStatic) {
|
if (CopyWebpackPluginVersion > 5) {
|
if (platform === 'app-plus') {
|
ignore.push(normalizePath(path.resolve(process.env.UNI_INPUT_DIR, assetsDir, 'app/**/*')))
|
} else if (platform === 'h5') {
|
ignore.push(normalizePath(path.resolve(process.env.UNI_INPUT_DIR, assetsDir, 'web/**/*')))
|
}
|
ignore.push(normalizePath(path.resolve(process.env.UNI_INPUT_DIR, assetsDir, platform + '/**/*')))
|
} else {
|
if (platform === 'app-plus') {
|
ignore.push('app/**/*')
|
} else if (platform === 'h5') {
|
ignore.push('web/**/*')
|
}
|
ignore.push(platform + '/**/*')
|
}
|
if (platform === 'app-plus') {
|
ignoreStatic.push(['static', 'app'])
|
} else if (platform === 'h5') {
|
ignoreStatic.push(['static', 'web'])
|
}
|
ignoreStatic.push(['static', platform])
|
}
|
|
let isIgnoreChecked = false
|
|
function checkIgnoreStatic (ignoreStatic) {
|
if (isIgnoreChecked) {
|
return
|
}
|
isIgnoreChecked = true
|
const existIgnore = new Set()
|
ignoreStatic.forEach(ignore => {
|
const dir = path.resolve(process.env.UNI_INPUT_DIR, ...ignore)
|
if (fs.existsSync(dir)) {
|
existIgnore.add(ignore.join('/'))
|
}
|
})
|
if (existIgnore.size) {
|
console.log('已忽略静态资源目录:' + [...existIgnore].join('、') +
|
'。详见:https://uniapp.dcloud.net.cn/tutorial/platform.html#static')
|
}
|
}
|
|
// 暂未考虑动态添加static目录
|
function getAssetsCopyOptions (assetsDir) {
|
const ignore = []
|
const ignoreStatic = []
|
global.uniPlugin.platforms.forEach(platform => {
|
if (global.uniPlugin.name !== platform) {
|
addIgnore(ignore, assetsDir, platform, ignoreStatic)
|
}
|
})
|
checkIgnoreStatic(ignoreStatic)
|
const copyOptions = []
|
// 主包静态资源
|
const mainAssetsCopyOption = getAssetsCopyOption(assetsDir, CopyWebpackPluginVersion > 5 ? {
|
noErrorOnMissing: true,
|
globOptions: {
|
ignore
|
}
|
} : {
|
ignore
|
})
|
if (mainAssetsCopyOption) {
|
copyOptions.push(mainAssetsCopyOption)
|
}
|
// 分包静态资源
|
process.UNI_SUBPACKAGES &&
|
Object.keys(process.UNI_SUBPACKAGES).forEach(root => {
|
const subAssetsCopyOption = getAssetsCopyOption(path.join(root, assetsDir), CopyWebpackPluginVersion > 5 ? {
|
noErrorOnMissing: true,
|
globOptions: {
|
ignore
|
}
|
} : {
|
ignore
|
})
|
if (subAssetsCopyOption) {
|
copyOptions.push(subAssetsCopyOption)
|
}
|
})
|
return copyOptions
|
}
|
|
function getUniModulesAssetsCopyOptions (assetsDir) {
|
const copyOptions = []
|
global.uniModules.forEach(module => {
|
copyOptions.push(
|
...getAssetsCopyOptions('uni_modules/' + module + '/' + assetsDir)
|
)
|
})
|
return copyOptions
|
}
|
|
function getCopyWebpackPluginOptions (platformOptions, vueOptions) {
|
const copyOptions = getAssetsCopyOptions(assetsDir).concat(
|
getUniModulesAssetsCopyOptions(assetsDir)
|
)
|
global.uniPlugin.copyWebpackOptions.forEach(copyWebpackOptions => {
|
const platformCopyOptions =
|
copyWebpackOptions(platformOptions, vueOptions, copyOptions) || []
|
platformCopyOptions.forEach(copyOption => {
|
if (typeof copyOption === 'string') {
|
copyOption = getAssetsCopyOption(copyOption)
|
}
|
copyOption && copyOptions.push(copyOption)
|
})
|
})
|
// 自动化测试时,不启用androidPrivacy.json
|
if (process.env.UNI_PLATFORM === 'app-plus' && !process.env.UNI_AUTOMATOR_WS_ENDPOINT) {
|
const fileName = 'androidPrivacy.json'
|
const context = path.resolve(process.env.UNI_INPUT_DIR)
|
if (fs.existsSync(path.join(context, fileName))) {
|
copyOptions.push({
|
from: fileName,
|
context,
|
to: fileName,
|
transform (content) {
|
const options = initI18nOptions(
|
process.env.UNI_PLATFORM,
|
process.env.UNI_INPUT_DIR,
|
false,
|
true
|
)
|
if (!options) {
|
return content
|
}
|
return compileI18nJsonStr(content.toString(), options)
|
}
|
})
|
}
|
}
|
return copyOptions
|
}
|
|
module.exports = {
|
assetsDir,
|
getCopyWebpackPluginOptions
|
}
|