【问题标题】:Copy plugin dlls to folder after successful build only when output is changed仅在更改输出时成功构建后将插件 dll 复制到文件夹
【发布时间】:2017-08-10 09:13:49
【问题描述】:

我已经动态加载了插件库,我想在开发过程中将它们推送到正在运行的具有新版本的 Web 主机。为了避免复制时出现“文件正在使用”错误,我在 csproj 中使用 msbuild 创建了 app_offline.htm 以回收 Web 应用程序。

<ItemGroup>
  <ModuleFiles Include="$(TargetDir)*.dll" />
</ItemGroup>

<Target Name="PublishModule" AfterTargets="PostBuildEvent">
  <WriteLinesToFile File="$(SolutionDir)src\FooBar.Web.Mvc\app_offline.htm" />
  <Copy SourceFiles="@(ModuleFiles)" DestinationFolder="$(SolutionDir)src\FooBar.Web.Mvc\Modules\FooBar.Blog\" SkipUnchangedFiles="true" />
  <Delete Files="$(SolutionDir)src\FooBar.Web.Mvc\app_offline.htm" />
</Target>

它按预期工作,但我想知道是否可以通过将PublishModule 目标包装为仅在输出更改时执行来改进它。因此,如果我构建没有更改的插件,它不会不必要地回收网络主机。 SkipUnchangedFiles 防止复制任何未更改的 DLL,但仍会创建 app_offline

我需要这样的东西,但它似乎没有任何作用。

<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>

【问题讨论】:

    标签: visual-studio msbuild aspnetboilerplate


    【解决方案1】:

    您可以使您的目标增量,以便它仅在输入更改或缺少预期输出时构建:

    <ItemGroup>
      <ModuleFiles Include="$(TargetDir)*.dll" DestinationPath="$(SolutionDir)src\FooBar.Web.Mvc\Modules\FooBar.Blog\%(Filename)%(Extension)" />
    </ItemGroup>
    
    <Target Name="PublishModule" AfterTargets="PostBuildEvent" Inputs="@(ModuleFiles)" Outputs="@(ModuleFiles->'%(DestinationPath)')">
      <WriteLinesToFile File="$(SolutionDir)src\FooBar.Web.Mvc\app_offline.htm" />
      <Copy SourceFiles="@(ModuleFiles)" DestinationFiles="@(ModuleFiles->'%(DestinationPath)')"/>
      <Delete Files="$(SolutionDir)src\FooBar.Web.Mvc\app_offline.htm" />
    </Target>
    

    有关增量构建的详细信息,请参阅 How to: Build Incrementally

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2017-05-04
      • 2021-08-03
      • 2011-04-12
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2020-02-04
      • 2014-09-23
      相关资源
      最近更新 更多