【问题标题】:MSBuild "Debug" configuration not working in VS 2010 Beta 2MSBuild“调试”配置在 VS 2010 Beta 2 中不起作用
【发布时间】:2010-01-21 14:32:08
【问题描述】:

我正在尝试设置用于开发、调试和部署 Windows 桌面小工具的环境。我在项目中遇到了一些障碍,当配置设置为“调试”时,我无法在我的小工具上运行构建。如果配置设置为“发布”,则构建会执行以下自定义任务:

  1. 将小工具内容复制到单独的文件夹中。
  2. 缩小/混淆 javascript 文件,删除 cmets 和空格。
  3. 将文件打包成 CAB 文件。
  4. 使用数字证书签署 CAB 文件。

这运行得很好,我的“调试”配置定义了以下任务

  1. 将小工具文件夹复制到AppData\Local\Microsoft\Windows Sidebar\Gadgets\
  2. 使用 IDesktopGadget 界面启动小工具。

如果我将这两个任务复制到“发布”配置中,它们运行得很好——没有任何问题。我尝试创建一个名为“Test”的单独配置,从“Release”配置中复制。

如果我尝试构建“发布”以外的任何配置,我会收到一条即时消息,提示“构建成功”,但根本没有任何任务运行。

编辑:我已经开始赏金了,因为我在 VS 2010 RC 上仍然存在同样的问题,而且非常令人沮丧。

进一步编辑:
感谢 John,我能够调试构建过程。它让我意识到带有调试条件的<Target> 元素被完全忽略(甚至没有处理)。当我交换 <Target> 元素的位置时,它起作用了:

<Target Name="Build" Condition="'$(Configuration)' == 'Release'">
  <!--
      <Obfuscate PathToJasob="C:\Program Files (x86)\Jasob.com\Jasob 3.5" Path="$(GadgetFolder)" Output="$(GadgetName)_obf" log="jasob_log.txt" />
  -->
  <BuildGadget BuildFormat="CAB" Path="$(GadgetFolder)" Target="$(GadgetName).gadget" />
  <SignGadget CertName="Cert1" TimestampURL="http://timestamp.comodoca.com/authenticode" Target="$(GadgetName).gadget" />
</Target>
<Target Name="Build" Condition="'$(Configuration)' == 'Debug'">
  <CopyToGadgets GadgetFolder="$(GadgetFolder)" GadgetName="$(GadgetName)" />
  <RunGadget GadgetName="$(GadgetName)" />
</Target>

所以看起来第二个&lt;Target Name="Build"&gt; 元素覆盖了第一个元素,尽管存在Condition 属性。我能做什么?

【问题讨论】:

  • 进行诊断日志记录时的构建输出是什么? (将/verbosity:diag 作为标志传递给 msbuild 命令行)
  • 在运行调试构建之前是否删除了所有以前创建的 dll 和 pdb 文件,以确保 msbuild 认为它们不是最新的?您是否也从卷影副本缓存中删除了这些文件(在“c:\documents and settings\\local settings\”中的某个位置)?

标签: visual-studio-2010 msbuild windows-desktop-gadgets


【解决方案1】:

正如乔所说:

像这样改变你的输出路径,看看是否能解决问题:

<OutputPath>bin\Debug\</OutputPath>

更新

你试过运行msbuild /verbosity:diagnostic吗?

你可以尝试一下并显示输出吗?

第二次更新

创建一个目标“构建”,然后在该目标中创建两个任务:

<Target Name="Build">
    <CallTarget Targets="BuildRelease" Condition="'$(Configuration)' == 'Release'" />
    <CallTarget Targets="BuildDebug" Condition="'$(Configuration)' == 'Debug'" />
</Target>

<Target Name="BuildRelease">
    <!--
        <Obfuscate PathToJasob="C:\Program Files (x86)\Jasob.com\Jasob 3.5" Path="$(GadgetFolder)" Output="$(GadgetName)_obf" log="jasob_log.txt" />
    -->
    <BuildGadget BuildFormat="CAB" Path="$(GadgetFolder)" Target="$(GadgetName).gadget" />
    <SignGadget CertName="Cert1" TimestampURL="http://timestamp.comodoca.com/authenticode" Target="$(GadgetName).gadget" />
</Target>

<Target Name="BuildDebug">
  <CopyToGadgets GadgetFolder="$(GadgetFolder)" GadgetName="$(GadgetName)" />
  <RunGadget GadgetName="$(GadgetName)" />
</Target>

【讨论】:

  • 正如我在回复乔的评论中所说,我已经尝试过了。事实上,它设置为 `bin\Release` 的原因首先是因为我复制了 Release 配置以使其正常工作。
  • 谢谢,您对乔的回复不是很清楚。这澄清了它。
  • @John:感谢您为我指明调试方向。我对使用 VS 很陌生,所以我不知道你可以这样做。我发现了问题所在并将其编辑到我的问题中。你有什么进一步的想法吗?再次感谢:-)
  • @Andy E - 目标的名称必须是唯一的,因此 msbuild 解析器可能只是删除了名为“Build”的第二个目标。制作 2 个特定于调试或发布的目标,然后更新您的构建目标以根据构建类型有条件地调用其中一个。
  • @John:非常感谢您的帮助,它运行良好。谢谢一百万!
【解决方案2】:

只是猜测:

您的调试版本的输出路径设置为bin\Release\bin\Release\ 中文件的时间戳可能导致 MSBuild 断定调试版本已经是最新的。尝试将输出路径更改为 bin\Debug\ 以进行调试构建。

【讨论】:

  • 谢谢,我很感激这个答案,即使这只是一个猜测。唉,直到我将“Release”配置复制到“Debug”配置以尝试使其正常工作之前,情况并非如此。不过,我还是会把它改回来。
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多