То, что я хочу получить
Запуск сценария Python 3.7 после пост-сборки. NET Core 3.1, поэтому он работает из коробки как на Linux, так и на * Windows.
Допущения, которые я делаю
- На машине, на которой будет построен проект, у нас будет установлено как минимум 2 версии Python, т.е. 2,7 и 3.6 +.
- Обе версии Python находятся в PATH.
- Я бы хотел избежать любых манипуляций, таких как переименование двоичных файлов или редактирование PATH et c. Это должно работать из коробки, без каких-либо взломов.
Дополнительная проблема
Для доступа к сценарию я использую макросы MSBuild, такие как $(SolutionDir)
, поэтому путь Сценарий будет зависеть от ОС из-за /
и \
Что я пробовал
Насколько я понимаю: наличие Python 2.x и 3.x параллельно установленный самый простой способ убедиться, что сценарий будет выполняться с использованием Python 3.x - это использовать py -3
на Windows и python3
на Linux. Поскольку вызов python
будет влиять на выполнение сценария с использованием Python 2.x.
Я попытался заставить MSBuild запускать различные сценарии после сборки, по крайней мере, 3 различными способами:
(1 )
<ItemDefinitionGroup>
<PostBuildEvent Condition="'$(OS)' == 'Unix' ">
<Message>Uisng post-build scripts for Unix/Linux
</Message>
<Command>python3 $(SolutionDir)BuildTools\PostBuild.py -s $(SolutionDir) -p $(ProjectPath) -c $(ConfigurationName) -t $(TargetDir) -n $(ProjectName)
</Command>
</PostBuildEvent>
<PostBuildEvent Condition="'$(OS)' == 'Windows_NT' ">
<Message>Using post-build scripts for Windows
</Message>
<Command>py -3 $(SolutionDir)BuildTools/PostBuild.py -s $(SolutionDir) -p $(ProjectPath) -c $(ConfigurationName) -t $(TargetDir) -n $(ProjectName)
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
(2)
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(OS)' == 'Windows_NT'">
<Exec Command="py -3 $(SolutionDir)BuildTools\PostBuild.py -s $(SolutionDir) -p $(ProjectPath) -c $(ConfigurationName) -t $(TargetDir) -n $(ProjectName) -o $(TargetPath) -f $(TargetFileName)" />
</Target>
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(OS)' == 'Unix'">
<Exec Command="python3 $(SolutionDir)BuildTools/PostBuild.py -s $(SolutionDir) -p $(ProjectPath) -c $(ConfigurationName) -t $(TargetDir) -n $(ProjectName) -o $(TargetPath) -f $(TargetFileName)" />
</Target>
(3)
<PropertyGroup>
(...)
<IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows>
<IsLinux Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">true</IsLinux>
</PropertyGroup>
И затем использовать эти свойства для условия в (2) и (3).
Но ничего, если это работает. Что мне не хватает? Или что я делаю неправильно? Может быть, есть какой-то другой способ достижения того же эффекта?
Большое спасибо за помощь! :)