Обновление ресурса перед многоцелевой сборкой Visual Studio .csproj
У меня есть .csproj
файл с несколькими целями. Это начинается так:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net35;net40;net45;netcoreapp2.0;netstandard2.0</TargetFrameworks>
...
Это проект C#, который использует Selenium и должен автоматически обновлять файл javascript с помощью NPM. Каждый такой файл javascript должен быть помечен как Embedded Resource
,
Я попробовал несколько способов запустить NPM перед сборкой. Я попытался написать командный файл, который запускается перед сборкой, я попытался установить расширение Nuget для обновления NPM и даже попытался добавить событие перед сборкой, которое обновляет файлы.
Проблема в том, что это происходит для каждой цели, хотя мне нужно, чтобы это произошло один раз, до начала сборки.
Я искал все соответствующие документы MSBuild, которые Microsoft предоставляет для поиска решения, но тщетно.
В настоящее время я обновляю скрипты так:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="cd $(ProjectDir)Properties\NodeResources
call npm update && copy node_modules\mycompany\firstpackage\dist ..\Resources && copy node_modules\mycompany\secondpackage\dist ..\Resources" />
</Target>
<ItemGroup>
<None Remove="Properties\Resources\script1.js" />
<None Remove="Properties\Resources\script2.js" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources\script1.js" />
<EmbeddedResource Include="Properties\Resources\script2.js" />
</ItemGroup>
У кого-нибудь есть идеи, как это сделать?
1 ответ
Вы должны понимать, как работает сборка для мульти-фреймворков. Он не берет один проект и не строит его для нескольких фреймворков, а запускает некоторые процессы в зависимости от количества фреймворков.
Таким образом, нет никакого контакта между процессами.
Но я предлагаю вам создать в одиночку csproj
файл (это на самом деле project
файл с msbuild
конфигурации), без реального проекта и внутри него, переопределите цель сборки с помощью команды npm и команды для построения решения.
Другой вариант - провести msbuild property
или ** переменная среды` или временный файл и т. д., и обновите их статус после первого выполнения команды, и проверьте статус перед командой. Есть оставшийся без ответа вопрос по этому поводу.