MSBuild: условно запускать веб-пакеты только при наличии изменений - PullRequest
0 голосов
/ 29 февраля 2020

Мы используем Visual Studio 2019 и успешно настроили задачи MSBuild для запуска веб-пакета для нас - как в режиме отладки, так и в режиме производства.

Но запускать каждый раз при сборке проекта, например когда запускать модульные тесты, и в веб-проекте нет изменений, нам не нужно выполнять веб-пакет.

Есть ли способ настроить задачу сборки на выполнение только при изменении файлов в определенной папке?

Вот наша текущая конфигурация:

<Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug'">
  <!-- Ensure Node.js is installed -->
  <Exec Command="node --version" ContinueOnError="true">
    <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
  </Exec>
  <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project. To continue, please install Node.js from https://nodejs.org/, and then restart your command prompt or IDE." />

  <!-- In development, the dist files won't exist on the first run or when cloning to
       a different machine, so rebuild them if not already present. -->
  <Message Importance="high" Text="Performing first-run Webpack build..." />
  <Exec Command="node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js" />
  <Exec Command="node node_modules/webpack/bin/webpack.js" />
</Target>

<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
  <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
  <Exec Command="npm install" />
  <Exec Command="node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod" />
  <Exec Command="node node_modules/webpack/bin/webpack.js --env.prod" />

  <!-- Include the newly-built files in the publish output -->
  <ItemGroup>
    <DistFiles Include="wwwroot\dist\**" />
    <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
      <RelativePath>%(DistFiles.Identity)</RelativePath>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </ResolvedFileToPublish>
  </ItemGroup>
</Target>

1 Ответ

0 голосов
/ 02 марта 2020

Есть ли способ настроить задачу сборки так, чтобы она выполнялась только при изменении файлов в определенной папке?

Вы можете различить publi sh и построить процесс с помощью свойства DeployOnBuild.

Решение

Вам нужно только добавить условие к DebugRunWebpack target:

<Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' and 'DeployOnBuild'=='true'">
  <!-- Ensure Node.js is installed -->
......    
</Target>

И оно будет выполнение цели только во время процесса publi sh.

Кроме того, цель , PublishRunWebpack выполняется после ComputeFilesToPublish, который принадлежит процессу Publi sh. Так что не беспокойся об этом.

Обновление 1

Чтобы определить, изменились ли эти файлы, вы можете попробовать выполнить следующее условие:

<Target Name="xxxx" Condition="$([System.DateTime]::Parse('%(ModifiedTime)').Ticks) &gt; $([System.IO.File]::GetLastWriteTime('$(xxxxxxxx)%(RecursiveDir)%(Filename)%(Extension)').Ticks)" />

Примечание $(xxxxxxxx)%(RecursiveDir)%(Filename)%(Extension) означает, что все файлы в этой папке

Кроме , вы можете обратиться к этому документу .

Надеюсь мог бы помочь вам.

...