Visual Studio大好き(codeじゃないほう)
今回はVisualStudio(2022)でRustを快適(?)に運用する方法を共有したいと思います。
完成形
ディレクトリ構造
動作
プロジェクトのビルドが完了すると、Rustのコンパイルが始まり、生成結果フォルダに (プロジェクト名).rs.dll という名のバイナリがコピーされる。
長所
- ケース規則が揃う(プロジェクト直下はパスカルケース、フォルダー内はスネークケース)
- Rustとその他(今回はC#)をまとめてコンパイル結果に入れられる。
手順
0. Pythonの準備
インストールできてなかったらして下さい。
1. プロジェクトの作成
普通にプロジェクトを作る。
今回はC#(csproj)でやった。他のプロジェクトでもできると思うけど保証しない。
2. Cargo.toml の作成
公式ドキュメントに従って、好きに書いて下さい。
この時、プロジェクト名はスネークケースにしましょう。
3. Rustプロジェクトの準備
プロジェクトフォルダ内に src フォルダ、その下に lib.rs などを置く。
4. PostBuild.py の作成
プロジェクトフォルダー直下に PostBuild.py を作る。
中身はこんな感じにする。
import sys
import os
import shutil
import subprocess
def snake_to_pascal(s):
return '.'.join(word.capitalize() for word in s.split('_'))
config = sys.argv[1]
dest = sys.argv[2]
if config == "Debug":
subprocess.run(["cargo", "build", "--lib"])
source = os.path.join("target", "debug")
elif config == "Release":
subprocess.run(["cargo", "build", "--lib", "--release"])
source = os.path.join("target", "release")
else:
raise ValueError
for file_src in os.listdir(source):
if file_src.endswith(".dll"):
file_dst = snake_to_pascal(os.path.splitext(file_src)[0]) + ".rs.dll"
shutil.copy2(os.path.join(source, file_src), os.path.join(dest, file_dst))
elif file_src.endswith(".pdb"):
file_dst = snake_to_pascal(os.path.splitext(file_src)[0]) + ".rs.pdb"
shutil.copy2(os.path.join(source, file_src), os.path.join(dest, file_dst))
5. プロジェクトの編集
以下の要素をProject要素直下に置く。
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="py PostBuild.py $(ConfigurationName) $(TargetDir)" />
</Target>
6. gitignore(必要であれば)
targetディレクトリを除外するため、以下の文を .gitignore に追加する。
# Cargo build target
target/
おわりに
なにか改善案あればお聞かせ下さい。