Преглед изворни кода

feat: make npm package install work on windows (#2419)

Mani Sundararajan пре 1 година
родитељ
комит
bbaae459c6

+ 4 - 2
packages/opencode/bin/opencode.cmd

@@ -52,5 +52,7 @@ echo It seems that your package manager failed to install the right version of t
 exit /b 1
 
 :execute
-rem Execute the binary with all arguments
-"%resolved%" %*
+rem Execute the binary with all arguments in the same console window
+rem Use start /b /wait to ensure it runs in the current shell context for all shells
+start /b /wait "" "%resolved%" %*
+exit /b %ERRORLEVEL%

+ 5 - 0
packages/opencode/script/postinstall.mjs

@@ -70,6 +70,11 @@ function findBinary() {
 
 function main() {
   try {
+    if (os.platform() === "win32") {
+      console.log("Windows detected, skipping postinstall")
+      return
+    }
+
     const binaryPath = findBinary()
     const binScript = path.join(__dirname, "bin", "opencode")
 

+ 32 - 0
packages/opencode/script/preinstall.mjs

@@ -0,0 +1,32 @@
+#!/usr/bin/env node
+
+import fs from "fs"
+import path from "path"
+import os from "os"
+import { fileURLToPath } from "url"
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url))
+
+function main() {
+  if (os.platform() !== "win32") {
+    console.log("Non-Windows platform detected, skipping preinstall")
+    return
+  }
+
+  const binDir = path.join(__dirname, "bin")
+  const unixScript = path.join(binDir, "opencode")
+
+  console.log("Windows detected: Configuring bin scripts for Windows")
+
+  if (fs.existsSync(unixScript)) {
+    console.log("Removing Unix shell script from bin/")
+    fs.unlinkSync(unixScript)
+  }
+}
+
+try {
+  main()
+} catch (error) {
+  console.error("Preinstall script error:", error.message)
+  process.exit(0)
+}

+ 2 - 0
packages/opencode/script/publish.ts

@@ -66,6 +66,7 @@ for (const [os, arch] of targets) {
 
 await $`mkdir -p ./dist/${pkg.name}`
 await $`cp -r ./bin ./dist/${pkg.name}/bin`
+await $`cp ./script/preinstall.mjs ./dist/${pkg.name}/preinstall.mjs`
 await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs`
 await Bun.file(`./dist/${pkg.name}/package.json`).write(
   JSON.stringify(
@@ -75,6 +76,7 @@ await Bun.file(`./dist/${pkg.name}/package.json`).write(
         [pkg.name]: `./bin/${pkg.name}`,
       },
       scripts: {
+        preinstall: "node ./preinstall.mjs",
         postinstall: "node ./postinstall.mjs",
       },
       version,