テンプレートリポジトリからPowerShellスクリプトで楽に新規作成する

# 概要
* GitHubテンプレートリポジトリから、PowerShellスクリプト(.ps1)で楽に新規プロジェクトを作成する
* スクリプトの実行ポリシーについて少し触れる


# 経緯
poetryやNext.jsのテンプレートを(自分用に)作ってGitHubに置いています。

https://github.com/torippy1024/poetry-template

https://github.com/torippy1024/nextjs-advanced-template

(ちなみにpoetryテンプレート自体の解説は以下の記事に書きました)

https://qiita.com/torippy/items/9fb45c2eb8ba1d8fde64

使うときは、

```powershell
git clone https://github.com/torippy1024/poetry-template.git projectName
cd projectName
```
にようにクローンすればいいんですけど、ちょっと面倒。
あと新しいプロジェクトとして管理するので、リモートリポジトリはこの段階でテンプレートから切り離したいですね。（誤プッシュする可能性もあるし）
ついでにVSCodeで開発するのでcloneと同時にVSCodeで開いてしまいたいですね。

ということで、テンプレートリポジトリから新規プロジェクト作成時に実行したいのは以下になります。
```powershell
git clone https://github.com/torippy1024/poetry-template.git projectName
cd projectName
git remote rm origin
code .
```

毎回全部打つのは面倒ですね…。


# PowerShellスクリプトを作成
```powershell
git clone https://github.com/torippy1024/poetry-template.git projectName
cd projectName
git remote rm origin
code .
```
を、
```powershell
poetry-template projectName
```
みたいなコマンド一発で実行できると便利ですね！
では作りましょう！

```powershell:poetry-template.ps1
Param ([string]$projectName = poetry-template)

git clone https://github.com/torippy1024/poetry-template $projectName
Set-Location $projectName
git remote rm origin
code .
```
大体そのままですね。
powershellのスクリプトファイルの拡張子は`ps1`です。

今回はプロジェクト名を引数として渡したいので、以下のように記述することで変数`$projectName`に引数を渡します。
```powershell
Param ([string]$projectName = poetry-template)
```
また、プロジェクト名の指定がなかったときはプロジェクト名が`poetry-template`になるようにデフォルト引数を与えてあげています。

あと元のスクリプトと違うところは`Set-Location`くらいですね。
ディレクトリ移動には普通`cd`を使うと思いますが、powershellでは実は`cd`は`Set-Location`のエイリアスになっています。
`cd`でも動くのですが、vscodeで[powershellの拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell)を入れて開発しているとwarningが出たのできちんと`Set-Location`と書いています。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/set-location?view=powershell-7.3


# PowerShellスクリプトを実行
PowerShellスクリプトができたので、さっそく実行してみましょう。
```powershell
.\poetry-template.ps1 projectName
```

さて、実行できたでしょうか？
「このシステムではスクリプトの実行が無効になっているため、…」といったエラーが出てないでしょうか？
おそらくデフォルトの設定では実行できないと思います。
もし実行できた場合はすでにご自身で何らかの設定を行っているだと思うので次の節に進みましょう。

実行ポリシーというものがあって、何も設定していないと`.ps1`のスクリプトファイルの実行がブロックされます。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3

詳しい説明は後ほどしますが、一旦以下のコマンドでスクリプトファイルを一時的に実行できるようにしましょう。
（現在のセッション限りの設定なので、powershellを開き直すとまた実行できなくなります）
```powershell
Set-ExecutionPolicy RemoteSigned Process
```

改めてps1を実行してみましょう。
```powershell
.\poetry-template.ps1 projectName
```

おそらくtestという名前でcloneされた上でvscodeが立ち上がったのではないでしょうか。
立ち上がってたらOKです。


# PowerShellスクリプトにパスを通す
ps1を実行できるようになりました。
しかし、今のままではps1ファイルをカレントディレクトリに置くか絶対パスで指定するかしてあげなければいけません。
パスを通すことでどこでも実行できるようにしてあげましょう。

パスの通し方の詳しい説明は省略しますが、自作ps1ファイルを置く用のフォルダを作って、そのフォルダにパスを通せばOKです。

あとは任意の位置で`poetry-template projectName`が実行できたら完成！
無事、GitHubテンプレートリポジトリからPowerShellスクリプト(.ps1)で楽に新規プロジェクトを作成できるようになりました！

ちなみにpowershellは入力補完してくれるので、最初の数文字打ってからtabを押せば全文入力しなくて済むと思います。
つまり、もともと
```powershell
git clone https://github.com/torippy1024/poetry-template.git projectName
cd projectName
git remote rm origin
code .
```
と打たなきゃいけなかったところが、
```powershell
poe
```
まで

便利ですね！


# スクリプトの実行ポリシーについて
完成！めでたしめでたし…と言いたいところですが、今のままでは毎回`Set-ExecutionPolicy RemoteSigned Process`打たなきゃいけないですね。

実行ポリシーをどうするかは悩みどころです。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3

こちらのサイトが非常に参考になると思います。

https://qiita.com/earthdiver1/items/b3f529c81f5892972a72

実行ポリシーは厳しい順に `Restricted`(デフォルト), `AllSigned`, `RemoteSigned`, `Unrestricted`, `Bypass` です。
スコープは狭い順に、`Process`(現在のセッションのみ), `CurrentUser`(現在のユーザーのみ),`LocalMachine`(現在のコンピュータすべて) です。
できるだけ厳しい＆狭いスコープの方がセキュリティ的には良いということですね。
利便性とセキュリティは表裏一体なところがあるので、どのレベルにしておくかはご自身の環境に合わせて設定すると良いでしょう。
`Get-ExecutionPolicy -List`で現在の実行ポリシーをスコープごとに確認することができます。

利便性重視の場合は以下を１回実行すると、そのユーザーでは永続的にps1ファイルを実行できるようにはなります。
```powershell
Set-ExecutionPolicy RemoteSigned CurrentUser
```

powershellの実行ポリシーについては単体で記事を書きました。

https://qiita.com/torippy/items/b10d84733f38e2225f53


# 終わりに
テンプレートリポジトリからPowerShellスクリプトで楽に新規プロジェクト作成する手順を紹介しました。

テンプレートの種類に合わせて、処理を追加したりしても良いかもしれませんね。
poetryプロジェクトなら`poetry install`まで入れたり、npmなら`npm install`したり。