为什么VS2013在使用其他机器时发布所有网站文件?

时间:2014-05-02 21:27:57

标签: web visual-studio-2013 publish

我有一台家用机器和办公机器用于使用Visual Studio 2013发布网站。如果我从同一台机器进行更改并重新发布,则只发布更改,而不是所有文件。

然而,当在办公室使用我的克隆机时,即使我做了最新的,做了一个小改动,并重新发布,所有文件都被发布,而不仅仅是那些已经改变的文件,而不仅仅是那些已被重新编译。所有dll文件,甚至是未更改或已使用新日期重新编译的第三方dll都将重新发布。如果我的队列在我上次发布后在他的机器上发布了一个小变化,那么同样的事情就会发生。如果从同一台机器发布两次,则只会发布已更改的文件,这不是问题。

是否因为使用了与上次发布时使用的机器不同的机器来阻止完全重新发布?感谢。

2 个答案:

答案 0 :(得分:4)

这似乎使“确定变化”慢得多,但对于.Net 4.5 [和 up(?)],使用以下信息: https://msdn.microsoft.com/en-us/library/ee942158

  

配置Web Deploy以使用校验和而不是日期来确定   哪些文件需要复制到服务器,添加以下元素   到.pubxml文件(发布设置):

<MSDeployUseChecksum>true</MSDeployUseChecksum>

像这样:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MSDeployUseChecksum>true</MSDeployUseChecksum>
    <!— other settings omitted to keep the example short -->
    <PublishDatabaseSettings>
      <!— this section omitted to keep the example short -->
    </PublishDatabaseSettings>
  </PropertyGroup>
</Project>

答案 1 :(得分:2)

首先,我完全不理解MSBuild + VS2013的行为和发布功能,因为我自己开始使用发布功能。我正在寻找一种方法来加速通过VS2013中的FTP Web部署进行发布。 (虽然我没有使用TFS获取最新消息。)

我想说这部分是在this SO question的不同背景下解释的。 MSBuild进程。正在比较某些文件的时间戳,然后可以指示MSBuild / VS2013目标(构建输出)是否是最新的。然后重新编译不是最新的文件。 当你们在不同的机器上工作时,时间戳很快就会有所不同。

要了解构建/发布期间实际发生的情况,请将构建输出详细程度设置为详细或诊断: VS2013菜单 - 工具 - 选项... - 项目和解决方案 - 构建和运行 - 输出详细程度 - 设置为 - &gt; 详细的诊断。运行构建,然后查看VS2013中的“输出”面板/选项卡。选择&#34;显示输出:Build&#34;如果尚未看到结果。 在检查构建详细信息后,不要忘记将其设置为原始设置,因为它可能会使构建速度降低一些。

但为什么即使是未更改的第三方dll也会被重新发布?可能是因为这些dll实际上是在构建期间被覆盖的。您可能拥有程序集引用属性&#34; Copy local&#34;设置为true以使您的网站无需任何手动上传即可运行。或者您正在使用命令行复制命令,在项目的构建后事件期间将overwrite参数显式设置为true(例如&copy; y;&#39;或者&#39; xcopy / y。 ..&#39)。然后,肯定会覆盖要发布的文件的时间戳,请参阅 &#34; obj \ Release \ Package \ PackageTmp&#34;文件夹(或例如:&#34; \ Debug&#34;而不是&#34; \ Release&#34;如果为所选发布配置文件设置了Debug版本。)

此外,如果您使用FTP发布,VS2013默认不检查目标Web服务器上的时间戳差异,至少这是我的经验。至于其他发布选项,如网络部署,我还不知道。但是,您遇到的差异对我来说似乎是正常的行为,因为您在不同的计算机上运行构建并从不同的计算机发布文件。因此,时间戳可能会有所不同......这再次表明&#39;已经改变了。要发布的文件。

我很好奇这个问题应该如何解决,我一开始就在寻找这个问题: 也许TFS构建服务器是一个选项,配置滚动构建。但我读了一篇特定的SO(抱歉,我刚刚注册的时候不能添加更多链接)建议做干净的构建以防止出现新问题。这将迫使完全发布,因为文件都被干净的构建所改变......所以我认为这不会起作用。

作为答案,您可能希望使用these FAQ answers on MSDN进行Web部署。看到问题:

  1. &#34;我可以从部署中排除特定文件或文件夹吗?&#34; .NET 4.0 / 4.5和/或
  2. &#34;如何使Web Deploy使用文件校验和而不是日期 确定哪些文件被更改了?&#34;仅限.NET 4.5!
  3. 第一个选项是排除文件。 第二个选项是使用校验和来比较文件而不是时间戳,但这可能会慢慢构建(?)过程,正如FAQ所说。请注意常见问题解答页面上的前几行,了解如何编辑发布配置文件以应用其中一个或两个元素!

    此外,还可以选择将第三方dll放在另一个项目中,然后您只能将该项目包含在部署中以用于特定解决方案配置(VS2013菜单 - 构建 - 配置管理器,请参阅中的复选框每个项目的“部署”列都在那里。虽然我不确定这是否是VS2013发布网络部署的一部分,因为此部署列复选框是由于某种原因,我不明白我的解决方案项目是灰色的...所以我无法测试它来验证这个选项。)

    虽然听起来很合理,但在更改任何设置或发布配置文件之前,不要忘记先创建备份/副本/屏幕截图,然后在您和您的同事工作的其他计算机上更改相同的设置/可配置文件