taro.mjs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { spawnSync } from 'node:child_process'
  2. import { createRequire } from 'node:module'
  3. import { copyFileSync, mkdirSync } from 'node:fs'
  4. import path from 'node:path'
  5. import { fileURLToPath } from 'node:url'
  6. import { environmentNames, outputDirectory, resolveEnvironment } from '../config/environments.ts'
  7. const root = fileURLToPath(new URL('..', import.meta.url))
  8. const [command, platform, selectedEnvironment] = process.argv.slice(2)
  9. if (!['build', 'watch'].includes(command) || !['weapp', 'h5'].includes(platform)) {
  10. console.error('Usage: node scripts/taro.mjs <build|watch> <weapp|h5> <development|test|production|all>')
  11. process.exit(1)
  12. }
  13. if (selectedEnvironment === 'all' && command !== 'build') {
  14. console.error('The all option is only available for one-off builds.')
  15. process.exit(1)
  16. }
  17. try {
  18. const environments = selectedEnvironment === 'all' ? environmentNames : [resolveEnvironment(selectedEnvironment).name]
  19. const require = createRequire(import.meta.url)
  20. const cli = path.join(path.dirname(require.resolve('@tarojs/cli/package.json')), 'bin/taro')
  21. for (const name of environments) {
  22. const output = path.join(root, outputDirectory(platform))
  23. // Each mode runs in its own process, so dotenv values cannot leak between builds.
  24. const metadataDirectory = path.join(root, '.cache/build', platform, name)
  25. const args = [cli, 'build', '--type', platform, '--mode', name, ...(command === 'watch' ? ['--watch'] : [])]
  26. console.log(`\n[${name}] ${platform} → ${outputDirectory(platform)}\n`)
  27. const result = spawnSync(process.execPath, args, {
  28. cwd: root,
  29. stdio: 'inherit',
  30. env: { ...process.env, APP_ENV: name, NODE_ENV: command === 'watch' ? 'development' : 'production', TARO_ENV: platform },
  31. })
  32. if (result.error) throw result.error
  33. if (result.status !== 0) process.exit(result.status ?? 1)
  34. mkdirSync(output, { recursive: true })
  35. if (platform === 'weapp') {
  36. copyFileSync(path.join(metadataDirectory, 'project.config.json'), path.join(output, 'project.config.json'))
  37. }
  38. copyFileSync(path.join(metadataDirectory, 'build-info.json'), path.join(output, 'build-info.json'))
  39. }
  40. } catch (error) {
  41. console.error(error instanceof Error ? error.message : error)
  42. process.exit(1)
  43. }