在多目标Visual Studio .csproj生成之前更新资源

时间:2019-01-24 09:11:29

标签: c# npm msbuild pre-build-event

我有一个包含多个目标的.csproj文件。它开始像这样:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net35;net40;net45;netcoreapp2.0;netstandard2.0</TargetFrameworks>
      ...

这是一个使用Selenium的C#项目,需要使用NPM自动更新javascript文件。每个此类javascript文件都应标记为Embedded Resource

在构建之前,我尝试了几种运行NPM的方法。我尝试编写在构建之前运行的批处理文件,尝试安装Nuget扩展程序以更新NPM,甚至尝试添加构建前事件来更新文件。

问题是,它针对每个目标发生,而我只需要在构建开始之前就发生一次。

我搜索了Microsoft提供的所有相关MSBuild文档,但都没有找到解决方案。

当前,我像这样更新脚本:

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec Command="cd $(ProjectDir)Properties\NodeResources&#xD;&#xA;call npm update &amp;&amp; copy node_modules\mycompany\firstpackage\dist ..\Resources &amp;&amp; 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 个答案:

答案 0 :(得分:0)

您需要了解多框架建筑物的工作原理。 它并不需要一个项目,就可以将其构建到多个框架中,而是根据框架的数量启动一些过程。

因此,进程之间没有联系。

但是,我建议您创建一个独立的csproj文件(它实际上是具有project配置的msbuild文件),没有真实的项目,并且在他里面覆盖 npm 命令和构建解决方案的命令> build 目标。

另一种选择是保存msbuild property或**环境变量`或临时文件等,并在首次执行命令后更新它们的状态,并在命令前检查状态。有一个尚未解决的问题。