Skip to content

Commit

Permalink
Fix setup on Windows and update README for Windows.
Browse files Browse the repository at this point in the history
  • Loading branch information
mpiroc committed Jul 18, 2018
1 parent 5502436 commit 7124ff1
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 9 deletions.
25 changes: 20 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,36 @@ aws s3 cp <s3-url> ~/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 <path-to-zip-file> -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 <path-to-zip-file> -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
Expand Down
3 changes: 3 additions & 0 deletions bundle-beta.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"%name%": "bin/%name%.js"
},
"scripts": {
"prepare": "tsc && chmod a+x bin/%name%.js",
"build": "tsc",
"watch": "tsc -w",
"cdk": "cdk"
},
Expand Down
6 changes: 4 additions & 2 deletions packages/aws-cdk/lib/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<string>((ok, fail) => {
Expand Down
7 changes: 7 additions & 0 deletions tools/y-npm/bin/y-npm.template.cmd
Original file line number Diff line number Diff line change
@@ -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" %*
)
4 changes: 3 additions & 1 deletion tools/y-npm/lib/run-npm-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Buffer>();
const stderr = new Array<Buffer>();
Expand Down

0 comments on commit 7124ff1

Please sign in to comment.