. NET Core 3.1 - Запуск Python 3.7 сценария пост-сборки независимо от платформы. - PullRequest
1 голос
/ 03 апреля 2020

То, что я хочу получить

Запуск сценария 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).

Но ничего, если это работает. Что мне не хватает? Или что я делаю неправильно? Может быть, есть какой-то другой способ достижения того же эффекта?

Большое спасибо за помощь! :)

1 Ответ

0 голосов
/ 03 апреля 2020

Microsoft об объявлении цели в файле проекта: https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-targets?view=vs-2019#declare -targets-in-the-project-file

Это означает, что, поскольку оба ваших события после сборки названы то же самое, вторая пост-сборка будет скрывать первую, что означает, что единственная пост-сборка, которую можно запустить, это скрипт Linux, когда вы работаете на машине Linux.

Чтобы заставить его работать измените свой код на что-то вроде этого:

<Target Name="PostBuildWindows" AfterTargets="PostBuildEvent" Condition="'$(OS)' == 'Windows_NT'">

<Target Name="PostBuildLinux" AfterTargets="PostBuildEvent" Condition="'$(OS)' == 'Unix'">

Вы можете изменить значение имени на что угодно, но убедитесь, что оно объясняет, что оно есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...