如何让Visual Studio可靠地在预建/编译过程中运行某些内容?

3

我遇到了使用MSBuild和VisualStudio在相同的csproj文件上工作的问题。

基本上,我正在尝试为数据库制作安装程序。数据库更改以xml文件的形式存在于另一个目录中。我需要将这些文件导入程序,然后在运行时通过查询选择要应用哪些更改。

我的想法是在预构建/编译步骤中压缩目录,并在运行程序时将该zip文件作为资源。我也可以在发布脚本中编译资源,但这种方式似乎更好,因为它使调试应用程序更容易。

我已经将以下内容添加到csproj文件中

<Target Name="PreBuildStep">
    <ItemGroup>
        <Patches Include="..\..\Database\**\*" />
    </ItemGroup>
</Target>
<Target DependsOnTargets="PreBuildStep" Name="BeforeBuild" Inputs="@(Patches)" Outputs="Resources\database.zip">
    <Exec Command="7z.bat a Resources\database.zip ..\..\Database -tzip" />
</Target>

如果从MSBuild运行解决方案或项目时,这个方法是可行的。增量构建参数(输入+输出)似乎也有效,如果我修改输入,则它会重新创建输出,反之则不会。同样,如果我删除输出文件,则它会重新创建。

我只是在我的路径上添加了一个批处理文件来获取7z.bat - 它只是调用7zip命令行(7z.exe)。

问题在于Visual Studio似乎不运行MSBuild,并且似乎很难让它可靠地运行任何东西 - 我还尝试了覆盖Build的depends on和使用pre-build事件,但都有相同的行为。

基本上发生的情况是,它偶尔会起作用,但如果我删除输出文件,然后按F5(在配置管理器中勾选了build)或者甚至ctrl + shift + b进行构建,那么它就不会重新创建。如果我进行重建或清理再构建,则它会按预期工作。

有人知道如何使其工作吗?这是我应该报告的VisualStudio中的错误吗?感觉像VisualStudio除非它认为已经对代码进行了一些更改,否则不会调用MSBuild。


当你按下 F5 键时,VS 会在运行之前检查是否需要构建。在你的情况下,VS 无法正确确定它,因为你正在使用自定义的预构建步骤(但在第一次运行时应该可以正确执行所有操作,对吧?)。如果发生了超出范围的更改,你可以随时使用 全部构建 选项。 - Sinatr
@Sinatr 是的,看起来就是这样。我可以理解为什么他们不使用 MSBuild 定义的过时 - 它们与源代码控制不太匹配 - 如果您回滚更新,通常未版本化的输出将比已版本化的输入更新。但这似乎基本上会导致在 VS 中自定义构建步骤完全无法正常工作。 - JonnyRaa
1个回答

9
Visual Studio使用名为“快速更新检查”的功能来确定是否必须重新构建项目。这样做是为了优化。此过程比实际运行msbuild增量构建更快。
要禁用特定项目的此功能,请将以下属性添加到项目文件中:
<PropertyGroup>
  <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>

进一步来看,似乎属性必须在项目文件本身中定义,而不是在导入的目标文件中(VS2013 Express)。 - tm1
我将这个放在<PropertyGroup>标签的<PreBuildEvent>中,现在它似乎正常工作了(MSVS 2013)。 - crokusek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接