mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-09-02 01:20:23 +08:00
fix(electron): properly dereference symlinks by copying actual content (#610)
cpSync with dereference:true does NOT convert symlinks to files. This implements a custom copyDereferenced function that: - Detects symlinks using lstatSync - Follows them using statSync - Copies actual file/directory content instead of symlink Fixes macOS arm64 codesign failure with electron-builder 26.4.0 which now does ad-hoc signing and runs codesign --verify.
This commit is contained in:
@@ -3,9 +3,49 @@
|
||||
* Copies node_modules to the standalone directory in the packaged app
|
||||
*/
|
||||
|
||||
const { cpSync, existsSync } = require("fs")
|
||||
const {
|
||||
copyFileSync,
|
||||
existsSync,
|
||||
lstatSync,
|
||||
mkdirSync,
|
||||
readdirSync,
|
||||
statSync,
|
||||
} = require("fs")
|
||||
const path = require("path")
|
||||
|
||||
/**
|
||||
* Copy directory recursively, converting symlinks to regular files/directories.
|
||||
* This is needed because cpSync with dereference:true does NOT convert symlinks.
|
||||
* macOS codesign fails if bundle contains symlinks pointing outside the bundle.
|
||||
*/
|
||||
function copyDereferenced(src, dst) {
|
||||
const lstat = lstatSync(src)
|
||||
|
||||
if (lstat.isSymbolicLink()) {
|
||||
// Follow symlink and check what it points to
|
||||
const stat = statSync(src)
|
||||
if (stat.isDirectory()) {
|
||||
// Symlink to directory: recursively copy the directory contents
|
||||
mkdirSync(dst, { recursive: true })
|
||||
for (const entry of readdirSync(src)) {
|
||||
copyDereferenced(path.join(src, entry), path.join(dst, entry))
|
||||
}
|
||||
} else {
|
||||
// Symlink to file: copy the actual file content
|
||||
mkdirSync(path.join(dst, ".."), { recursive: true })
|
||||
copyFileSync(src, dst)
|
||||
}
|
||||
} else if (lstat.isDirectory()) {
|
||||
mkdirSync(dst, { recursive: true })
|
||||
for (const entry of readdirSync(src)) {
|
||||
copyDereferenced(path.join(src, entry), path.join(dst, entry))
|
||||
}
|
||||
} else {
|
||||
mkdirSync(path.join(dst, ".."), { recursive: true })
|
||||
copyFileSync(src, dst)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = async (context) => {
|
||||
const appOutDir = context.appOutDir
|
||||
const resourcesDir = path.join(
|
||||
@@ -25,10 +65,7 @@ module.exports = async (context) => {
|
||||
console.log(`[afterPack] Copying node_modules to ${targetNodeModules}`)
|
||||
|
||||
if (existsSync(sourceNodeModules) && existsSync(standaloneDir)) {
|
||||
cpSync(sourceNodeModules, targetNodeModules, {
|
||||
recursive: true,
|
||||
dereference: true,
|
||||
})
|
||||
copyDereferenced(sourceNodeModules, targetNodeModules)
|
||||
console.log("[afterPack] node_modules copied successfully")
|
||||
} else {
|
||||
console.error("[afterPack] Source or target directory not found!")
|
||||
|
||||
Reference in New Issue
Block a user