しばたテックブログ

気分で書いている技術ブログです。

PowerShell Core 6.0の初期セットアップスクリプトを作りました

blog.shibata.tech

前にPSCoreUpdateというPowerShell Coreのアップデートを自動化するモジュールを作ったとお知らせしました。
このエントリ中で、

なお、このモジュールはあくまで更新のためのツールなので最初にPowerShell Core 6.0をインストールするのは手動で行う必要があります。

と記載し、この点に関しては今も変わってはいないのですが、初回インストールが手動なのはやっぱり面倒だったのでセットアップスクリプトを別に作ってみました。

初回インストールスクリプト

スクリプトはPSCoreUpdate内のこのページで公開しています。

github.com

PowerShell Coreのインストール手順はGitHubDocsで公開されており、基本的はこの手順を各OS・ディストリビューション毎にまとめただけのスクリプトになります。

基本方針として、Windows PowerShellやBashのコンソールにコピペして実行すれば良しなに最新のPowerShell Coreをインストールしてくれるものにしています。
方式としてはChocolateyRVMのインストール手順を参考にしています。*1

スクリプトの中身についてはGitHubで確認してください。
以下に現在のインストール手順を載せておきます。

Windows

前提条件として、Windows PowerShell 4.0以上がインストールされている必要があります。
(これはPowerShell Core 6.0をMSIからインストールするための前提条件です)

コマンドプロンプトから実行する場合

REM Command prompt
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "[Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12;iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/Install-LatestPowerShell.ps1'))"

PowerShellコンソールから実行する場合

# Windows PowerShell
Set-ExecutionPolicy Bypass -Scope Process -Force; [Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/Install-LatestPowerShell.ps1'))

macOS

macOS Sierra (10.12)以上が対象です。

# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_mac.sh | bash -s

Ubuntu

Ubuntu 17.04、16.04、14.04で実行可能です。

# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_ubuntu.sh | bash -s

RHEL、CentOS、Fedora

以下のディストリビューションで実行可能です。

  • RHEL 7
  • CentOS 7
  • Fedora 26、25
# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_rhel.sh | bash -s

Debian

Debian 9、8.7+で実行可能です。

# Bash
\wget -q --no-check-certificate https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_debian.sh -O - | bash -s

[Experimental] openSUSE、SLES

以下のディストリビューションで実行可能です。

  • openSUSE 42.1
  • SLES 12
# Bash
\curl -s https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/install_latestpowershell_suse.sh | bash -s

こちらは現在の最新バージョン(6.1.0-preview.1)ではzypperの設定まではうまくいくものの、PowerShellのインストール時に依存関係のエラーが出てしまいインストールが必ず失敗します。
詳細はこのへんを見てください。

このスクリプトを実行した後に手動で

sudo zypper install powershell

を実行し、依存関係のエラーを無視してインストールを続行すればインストールすることができます。
この依存関係のエラーについてはそのうち新しいバージョンで解消されると思います。

*1:手順は参考にしてますが、個人的な信条としてChocolateyが嫌いなのでローカルマシンにChocolateyをインストールしたくないのです...

PowerShell Core 6.0をデバッグ実行する - Visual Studio 2017編

前回の続き的な。

blog.shibata.tech

前回の時点では「まだVisual Studio 2017でのビルドはうまく動作しない」と説明しましたが、つい最近Visual Studioで動作させるための修正が完了したので実際に試してみました。

github.com

はじめに

基本的なところは前回と同様です。
IDEがVisual Studio CodeからVisual Studio 2017になっただけと考えて差し支えないでしょう。

ただ、詳細は後述しますが、Visual Studioだけでビルドに関するすべての手順を賄えるわけではなく少しだけPowerShellのコマンドを併用する必要があります。

PowerShellをデバッグ実行する

ここから具体的な手順の説明に入ります。

1. Gitのインストール

ソースコードをCloneするのにGitクライアントが必要です。
適当にインストールしてgitコマンドが使える様にしておいてください。

gitforwindows.org

ちなみに、Visual Studioをインストールした後にVisual Studio Installerから「Git for Windows」を選択してインストールしても構いません。

2. ソースのClone

PowerShellのリポジトリよりソースコードをCloneします。

今回はとりあえずデバッグ実行できれば良いので前回同様にリポジトリを直接Cloneしておきます。

任意のディレクトリで以下の様に--recursiveオプションを付けてgit cloneしてください。

git clone --recursive https://github.com/PowerShell/PowerShell.git

3. Visual Studio 2017のインストール

www.visualstudio.com

Visual Studio 2017をダウンロードしてインストールしてください。

私はProfessionalとEneterpriseで動作確認しましたがどのエディションでも大丈夫だと思います。
手元のVisual Studioは結構昔にインストール済みだったので具体的なインストール手順は紹介できませんが、

  • .NETデスクトップ開発 - C#をコンパイルできる標準的な構成
  • .NET Coreクロスプラットフォームの開発 - 要.NET Core SDK

のワークロードがインストールされていれば良いと思います。

なお、PowerShell Coreで必要な.NET Core SDKのバージョンは随時更新されていますので、場合によってはこちらから個別にダウンロードしてインストールする必要があるかもしれません。

本エントリを書いている時点では、PowerShell Core 6.1.0-preview.1をコンパイルするのに.NET Core SDK 2.1.4が必要です。

4. その他ツールのインストール

上記の他に

  • PowerShell 6.0の実行バイナリ(pwsh)
  • RCEdit

が必要になります。

こちらは前回と同様ですので、build.psm1モジュールのStart-PSBootstrap関数を使ってインストールしておけば良いでしょう。

# cd [PowerShellのルートディレクトリ]
cd .\PowerShell\
Import-Module .\build.psm1
Start-PSBootstrap

5. ビルドとデバッグ実行

CloneしたソースのルートディレクトリにPowerShell.slnというソリューションファイルがあるのでVisual Studioからこれを開きます。

f:id:stknohg:20180412001744p:plain

14のプロジェクトから成るソリューションで、Windowsの場合powershell-win-coreプロジェクトのProgram.csにエントリポイントがあります。


この初期状態で単純にソリューションのビルドをしても下図の様に幾つかエラーがでてしまいます。

f:id:stknohg:20180412001839p:plain

これはソースをCloneした直後の状態ではメッセージ等のリソースファイルが存在していないため、リソース不足によるコンパイルエラーとなってしまうためです。

リソースはVisual Studioからは作成できず*1build.psm1モジュールのStart-PSBuild関数を使う必要があります。

次の様にbuild.psm1モジュールをインポートし、-ResGenパラメータを指定してStart-PSBuildを実行してください。

# cd [PowerShellのルートディレクトリ]
cd .\PowerShell\
Import-Module .\build.psm1
Start-PSBuild -ResGen

エラー無く処理が終われば必要なリソースは作成されています。

f:id:stknohg:20180412001923p:plain


リソースが出来ている状態でビルドすればエラー無く完了するはずです。

f:id:stknohg:20180412002020p:plain

デバッグを開始してやれば下図の様にふつうにステップ実行できます。

f:id:stknohg:20180412002047p:plain

最後に

Visual Studio Codeも悪くはありませんがやっぱりVisual Studioの圧倒的な支援は最高です。
ほんとうに捗ります。

*1:もしできる方法があれば教えてください...

PSCoreUpdateというPowerShellモジュールを公開しました

個人的な不便さからPowerShell Coreのアップデートを自動化するためのモジュールを作りました。
ソースと基本的な使い方はGitHubに上げています。

github.com

作った動機

現在、Windows環境においては一度インストールしたPowerShell Core 6.0のアップデートを自動で行う方法は無く、毎回新しいインストーラを手動でダウンロードして実行しなおす必要があります。
一応Office等のMicrosoft製ソフトと同様にMicrosoft Update経由での自動アップデートに対応する計画が立てられている(#6118)のですが、実現までにはまだまだ時間がかかりそうです。

また、MacOS環境においてはHomebrew Caskによる更新が可能ですが、そもそも論としてHomebrewのインストール自体が割と手間なためHomebrewに頼らない更新方法が欲しかったというのもあります。

インストール方法

PowerShell Galleryからインストール可能です。

Install-Module PSCoreUpdate -Scope CurrentUser

なお、このモジュールはあくまで更新のためのツールなので最初にPowerShell Core 6.0をインストールするのは手動で行う必要があります。

使い方

このモジュールには4つのコマンドがあり、各コマンドの使い方をざっくり説明していきます。

Update-PowerShellCore

新しいバージョンのPowerShell Coreがリリースされている場合、インストーラーのダウンロードと自動実行を行います。
Windowsの場合はMSIファイル、MacOSの場合はPKGファイルをダウンロードして実行します。

新しいバージョンが無い場合は何もしませんが、-Forceパラメーターを指定することで過去バージョンのインストールを強制することも可能です。

# 実行例
Update-PowerShellCore -Latest

実行イメージはこんな感じです。

-Silentパラメーターを指定することでサイレントインストールにすることも可能です。

# 実行例
Update-PowerShellCore -Latest -Silent

なお、このコマンドはWindowsとMacOS専用です。
Linux環境においてはAptやYum等の標準のパッケージ管理ツールで十分との判断をしています。

Test-LatestVersion

現在のコンソールが最新バージョンかを判定します。

# 実行例
Test-LatestVersion

最新バージョンの場合

f:id:stknohg:20180408222143p:plain

最新バージョンでない場合

f:id:stknohg:20180408222340p:plain

Find-PowerShellCore

GitHubからPowerShell Coreのリリース情報を取得します。
パラメーターによるバージョン指定も可能です。

# 実行例
Find-PowerShellCore -Latest

f:id:stknohg:20180408222355p:plain

内部的にはGitHub REST APIを使っており、使用回数にレートリミットが設けれられています。
通常であれば問題にならないはずですが、レートリミットに引っかかる様な場合は-Tokenパラメーターにアクセストークンを指定することで回避可能にしています。

# 実行例
Find-PowerShellCore -Latest -Token $env:GITHUB_ACCESS_TOKEN

Save-PowerShellCore

PowerShell Coreのリリースアセット(MSIファイルなど)をダウンロードします。
Download-PowerShellCoreにエイリアスしています。

Save-PowerShellCore -Latest -AssetType MSI_WIN64 -OutDirectory C:\Temp

アセットの種類は以下となっています。

種類 内容
MSI_WIN32 [PowerShell version]-win-x86.msi
MSI_WIN64 [PowerShell version]-win-x64.msi
PKG_OSX1011 [PowerShell version]-osx.10.11-x64.pkg
PKG_OSX1012 [PowerShell version]-osx.10.12-x64.pkg
RPM_RHEL7 [PowerShell version]-rhel.7.x86_64.rpm
DEB_DEBIAN8 [PowerShell version]-debian.8_amd64.deb
DEB_DEBIAN9 [PowerShell version]-debian.9_amd64.deb
DEB_UBUNTU14 [PowerShell version]-ubuntu.14.nn_amd64.deb
DEB_UBUNTU16 [PowerShell version]-ubuntu.16.nn_amd64.deb
DEB_UBUNTU17 [PowerShell version]-ubuntu.17.nn_amd64.deb
APPIMAGE [PowerShell version]-x86_64.AppImage
TAR_LINUXARM32 [PowerShell version]-linux-arm32.tar.gz
TAR_LINUX64 [PowerShell version]-linux-x64.tar.gz
TAR_OSX [PowerShell version]-osx-x64.tar.gz
ZIP_WINARM32 [PowerShell version]-win-arm32.zip
ZIP_WINARM64 [PowerShell version]-win-arm64.zip
ZIP_WIN32 [PowerShell version]-win-x86.zip
ZIP_WIN64 [PowerShell version]-win-x64.zip

【2018/04/23追記】 初期セットアップスクリプト

初期セットアップスクリプトを作りました。
詳しくは下記エントリをご覧ください。

blog.shibata.tech