【问题标题】:Changes to csproj not taking effect对 csproj 的更改未生效
【发布时间】:2014-09-10 00:54:29
【问题描述】:

为了根据我的配置更新我的引用,我通过添加一个属性并更改所有引用以使用它来调整我的 .csproj 文件,如下所示:

<PropertyGroup>
    <ReferencePath Condition=" '$(Configuration)' ==  'Release'">foo\release\1.0.0.9\bin\</ReferencePath>
    <ReferencePath Condition=" '$(Configuration)' == 'Debug'">bar\debug\</ReferencePath>
</PropertyGroup>

<Reference Include="BasicControls, Version=5.0.53.0, Culture=neutral, PublicKeyToken=25ad4b03c913ffff, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>$(ReferencePath)\BasicControls.dll</HintPath>
</Reference>

出现问题并阻止更改传播。我对 .csproj 文件所做的任何操作都不会更改引用的路径 - 无论我做什么,右键单击引用并在属性中查看它的路径都会显示它在我开始编辑文件之前显示的相同路径。

  • 我已尝试卸载并重新加载项目
  • 我已尝试将配置从 Debug 更改为 Release
  • 我已经打开和关闭了解决方案
  • 解决方案关闭时,我删除了 .suo 文件。
  • 我在解决方案资源管理器上单击了重新加载。

.csproj 中的所有引用都使用 $(ReferencePath) 设置,而我的 ReferencePaths 都不使用原始路径。

我错过了什么?是不是我使用属性的方式有问题?

【问题讨论】:

  • 可能 ReferencePath 是 MsBuild 本身在某处使用的属性,所以我会给它一个自定义名称以确保。退出VS,添加一个目标来显示&lt;Target Name="ShowRefPath" BeforeTargets="Build"&gt; &lt;Message Text="$(MyRefPath)"/&gt;&lt;/Target&gt;之类的路径,启动VS,构建并检查它打印的内容?我不能 100% 确定即使 VS 显示的路径是错误的,构建也会使用它..
  • 感谢您的想法。我认为我的部分问题是我正在关闭解决方案而不是 VS。现在,当我关闭 VS、删除 suo 并重新打开 VS 时,我会看到所做编辑的效果。似乎 ReferencePath 可能是保留字,请参见例如codeproject.com/Articles/184718/… 。但是当我使用 MyRefPath 概念时,路径没有正确加载。我仍在努力弄清楚如何让我的改变做我想做的事。我尝试使用您的 Target 作为调试手段,但从未看到任何输出。
  • 但没有看到任何输出只有在 MyRefPath 属性为空时才会出现这种情况(或者也没有行 ShowRefPath: 表示目标甚至没有被调用?)将文本更改为"MyRefPath = $(MyRefPath)" 并添加Importance="high",因此您至少应该看到MyRefPath = 部分。检查命令行可能是为了确保它被使用。
  • 你说得对,我没有调用目标。我需要开始将其视为一个 Msbuild 文件,而不是“Visual Studio 的项目文件”。我对 MsBuild 不是很有经验(尽管很久以前我在 makefile 方面表现不错)。如果我不知道如何调用目标,我会请你用勺子喂我。
  • 本来想说 wiki 没问题,你比我强

标签: .net visual-studio-2012 msbuild csproj msbuild-propertygroup


【解决方案1】:

正如我在 cmets 中提到的,我认为 stijn 提供了很多关于如何调试 .csproj 文件问题的有用信息。他的一些更基本的帮助我解决了我的问题。由于 stijn 尚未在 cmets 中发布所有信息作为我接受的答案,因此我正在对其进行总结并使其成为社区 wiki。

  • 帮助我走上正轨的最简单的事情是在 .csproj 的编辑之间退出 VS。我一直在关闭解决方案并重新打开它,但不知何故有不同的结果。因此,如果您担心您的更改无法传播,请务必退出 VS。

  • 我看到 .suo 文件导致一些奇怪的缓存问题,我的文件不再引用的路径仍然出现。为了尽可能保持干净,退出 VS 后,删除 .suo。这只是一个偏好缓存;删除它不会让你失去任何东西。

  • 如果要调试变量,可以将以下代码放入 .csproj 中:

    <Target Name="ShowRefPath" BeforeTargets="Build"> <Message Text="$(MyRefPath)"/> </Target>

其中MyRefPath 是您有兴趣查看的变量。如果您将输出日志过滤器设置为正常或更高,它将在您构建时出现在您的输出日志中。

  • 我发现将输出日志过滤器(在工具-> 选项-> 项目和解决方案->MSBuild 项目输出详细程度)设置为详细信息给了我足够多的数据来调试我的潜在问题。它非常冗长,但这正是您当时正在寻找的内容。

其中,对我来说最有用的技巧是设置输出日志的详细程度并退出 VS 而不是关闭解决方案。

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 2016-11-12
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多