From 7124ff16221871bad29e69cb77a4b330ec0304aa Mon Sep 17 00:00:00 2001 From: Matthew Pirocchi Date: Tue, 10 Jul 2018 17:03:50 -0700 Subject: [PATCH] Fix setup on Windows and update README for Windows. --- README.md | 25 +++++++++++++++---- bundle-beta.sh | 3 +++ .../app/typescript/package.template.json | 2 +- packages/aws-cdk/lib/init.ts | 6 +++-- tools/y-npm/bin/y-npm.template.cmd | 7 ++++++ tools/y-npm/lib/run-npm-command.ts | 4 ++- 6 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 tools/y-npm/bin/y-npm.template.cmd diff --git a/README.md b/README.md index 4225aa8818965..5ba1d01917c29 100644 --- a/README.md +++ b/README.md @@ -37,21 +37,36 @@ aws s3 cp ~/aws-cdk.zip ### Install to ~/.cdk -Once you've downloaded the bits, install them into `~/.cdk`: +Once you've downloaded the bits, install them into `~/.cdk` and make sure that `~/.cdk/bin` is in your `PATH`: + +#### Linux/MacOS (bash/zsh) ```shell +# Install to ~/.cdk rm -fr ~/.cdk mkdir ~/.cdk unzip -d ~/.cdk + +# Add ~/.cdk/bin to your PATH +echo 'PATH=$PATH:$HOME/.cdk/bin' >> ~/.bashrc +echo 'PATH=$PATH:$HOME/.cdk/bin' >> ~/.zshrc ``` -Make sure the `~/.cdk/bin` is in your `PATH` +#### Windows (PowerShell) -```shell -# at the end of your ~/.bashrc or ~/.zshrc file -export PATH=$PATH:$HOME/.cdk/bin +```powershell +# Install to ~/.cdk +Remove-Item -Force -Recurse ~/.cdk +New-Item -Type Directory ~/.cdk +Expand-Archive -Path -DestinationPath ~/.cdk + +# Add ~/.cdk/bin to your PATH +$profilePath = Join-Path ([Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments)) "Profile.ps1" +Add-Content -Path $profilePath -Value '$env:Path = "$env:Path;$env:UserProfile\.cdk\bin"' ``` +### Install the command-line toolkit and docs + Install (or update) `aws-cdk` and `aws-cdk-docs` globally ```shell diff --git a/bundle-beta.sh b/bundle-beta.sh index 1e94dc86ff3da..391a1d2f37703 100755 --- a/bundle-beta.sh +++ b/bundle-beta.sh @@ -39,6 +39,9 @@ done echo "Installing y-npm" # using y-npm, we're so META! ${Y_NPM} install --global-style --no-save y-npm +# Because y-npm is installed on the build server, we need to bootstrap +# it on windows by manually creating the shim batch file. +cp ${root}/tools/y-npm/bin/y-npm.template.cmd node_modules/.bin/y-npm.cmd ln -s node_modules/.bin bin # Create a local maven repository diff --git a/packages/aws-cdk/lib/init-templates/app/typescript/package.template.json b/packages/aws-cdk/lib/init-templates/app/typescript/package.template.json index a5003cd4c5226..372b8423318b2 100644 --- a/packages/aws-cdk/lib/init-templates/app/typescript/package.template.json +++ b/packages/aws-cdk/lib/init-templates/app/typescript/package.template.json @@ -7,7 +7,7 @@ "%name%": "bin/%name%.js" }, "scripts": { - "prepare": "tsc && chmod a+x bin/%name%.js", + "build": "tsc", "watch": "tsc -w", "cdk": "cdk" }, diff --git a/packages/aws-cdk/lib/init.ts b/packages/aws-cdk/lib/init.ts index b7ba863a02882..bb66132cfb280 100644 --- a/packages/aws-cdk/lib/init.ts +++ b/packages/aws-cdk/lib/init.ts @@ -201,7 +201,9 @@ async function postInstall(language: string) { } async function postInstallTypescript() { - const yNpm = path.join(CDK_HOME, 'bin', 'y-npm'); + const yNpm = os.platform() === 'win32' ? + path.join(CDK_HOME, 'node_modules', '.bin', 'y-npm.cmd') : + path.join(CDK_HOME, 'bin', 'y-npm'); const command = await fs.pathExists(yNpm) ? yNpm : 'npm'; print(`Executing ${colors.green(`${command} install`)}...`); try { @@ -245,7 +247,7 @@ function isRoot(dir: string) { * @returns STDOUT (if successful). */ async function execute(cmd: string, ...args: string[]) { - const child = spawn(cmd, args, { stdio: [ 'ignore', 'pipe', 'inherit' ] }); + const child = spawn(cmd, args, { shell: true, stdio: [ 'ignore', 'pipe', 'inherit' ] }); let stdout = ''; child.stdout.on('data', chunk => stdout += chunk.toString()); return new Promise((ok, fail) => { diff --git a/tools/y-npm/bin/y-npm.template.cmd b/tools/y-npm/bin/y-npm.template.cmd new file mode 100644 index 0000000000000..bfc4734e5f836 --- /dev/null +++ b/tools/y-npm/bin/y-npm.template.cmd @@ -0,0 +1,7 @@ +@IF EXIST "%~dp0\node.exe" ( + "%~dp0\node.exe" "%~dp0\..\y-npm\bin\y-npm" %* +) ELSE ( + @SETLOCAL + @SET PATHEXT=%PATHEXT:;.JS;=;% + node "%~dp0\..\y-npm\bin\y-npm" %* +) diff --git a/tools/y-npm/lib/run-npm-command.ts b/tools/y-npm/lib/run-npm-command.ts index 522f237e5ad41..6d30fc19593d5 100644 --- a/tools/y-npm/lib/run-npm-command.ts +++ b/tools/y-npm/lib/run-npm-command.ts @@ -80,7 +80,9 @@ export function runCommand(command: string, args: string[], additionalEnv?: Node env[key] = value; } } - const child = spawn(command, args, { detached: false, env, stdio: ['inherit', 'pipe', 'pipe'] }); + // `shell: true` is required because on Windows, batch files must be run from a shell, and y-npm + // is invoked using the batch file y-npm.cmd (to work around symlink issues on Windows). + const child = spawn(command, args, { detached: false, env, shell: true, stdio: ['inherit', 'pipe', 'pipe'] }); debug(`Command PID: ${child.pid}`); const stdout = new Array(); const stderr = new Array();