我已经动态加载了插件库,我希望在开发过程中将其推送到运行带有新版本的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
目标包装到仅在输出更改时执行来改进它。因此,如果我构建没有更改的插件,它将不会不必要地回收Web主机。 SkipUnchangedFiles
可以防止复制任何未更改的DLL,但仍会创建app_offline
。
我需要这样的东西,但它似乎没有做任何事情。
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
答案 0 :(得分:2)
您可以将目标增量设置为仅在输入更改或缺少预期输出时构建:
<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。