【问题标题】:Project references outside solution in VS2010VS2010中的项目引用外部解决方案
【发布时间】:2011-11-18 16:14:43
【问题描述】:

根据this,应该可以引用解决方案之外的项目,并让它在 VS 和命令行中工作,但不能在 TFS 中工作。

不幸的是,当我尝试以这种方式对我的解决方案进行分区时,它在 VS2010/devenv 和 msbuild 中都不起作用。

在这两种情况下,错误都是:

没有为项目“Common.csproj”设置 OutputPath 属性。 请检查以确保您指定了有效的组合 该项目的配置和平台。配置='调试' 平台='AnyCPU'。如果其他项目也可能出现此错误 正在尝试遵循对该项目的项目到项目的引用, 此项目已卸载或未包含在解决方案中,并且 引用项目未使用相同或等效项构建 配置或平台。

但是,当前平台是“x86”,无论我在 VS 或 msbuild 中设置哪个平台和配置,它总是在尝试Debug|AnyCPU。在 msbuild 的情况下,如果我设置 /p:OutputPath=bin\x86\Debug 它会正确传播到子项目。

这是一个错误,我可以解决它吗?

更新

找到bug in MS Connect。不幸的是因为无法修复而关闭:(

更新 2

找到解决方法:设置ShouldUnsetParentConfigurationAndPlatform=false。在 msbuild 的命令行和项目文件中(在任何导入之前)都可以修复 Visual Studio。

【问题讨论】:

  • 这似乎仍然发生在 msbuild 版本 16.1.68.42340

标签: visual-studio visual-studio-2010 msbuild


【解决方案1】:

如果我正确理解了这个问题,那实际上是因为 AssignProjectConfiguration 目标没有正确设置这些项目的配置/平台属性。

如果您知道它们的配置和平台应该是什么,您总是可以只在 AssignProjectConfiguration 目标之后注入一个目标来运行,并覆盖代表未解决的每个项目的 SetConfiguration 和 SetPlatform 属性(意味着不是解决方案配置的一部分) 项目间参考。

出于某种愚蠢的原因,Microsoft 提供的目标将未解决的项目引用列表与已解决的项目引用存储在同一个集合中(但没有其他地方),这给您留下了 2 个选项:

  1. 只需手动设置每个项目的属性(即通过注入目标中的动态 ItemGroup 元素进行硬编码)。
  2. 您自己从注入的目标调用 AssignProjectConfiguration 任务,收集未分配的输出,为它们分配您选择的默认配置/平台。

无论哪种方式,一旦获得正确配置的项目引用列表,您就可以简单地将 ProjectReferenceWithConfiguration 项组中未解决的项替换为手动修改的对应项(使用另一个动态 ItemGroup 元素,先使用 Remove,然后使用 Include)。

请注意,我不会按照你的方式做事。如果您想将您的产品拆分为多个解决方案,那么我只需让每个解决方案将共享输出发布到一个公共暂存区域并使用 .proj 脚本将它们链接在一起。我已经学会了命令行样式的 MSBuild 和内部 VS 样式的 MSBuild 不混合的艰难方式(他们做出了一些奇怪的妥协以确保与非 MSBuild 项目系统的互操作性,其中整个 AssignProjectConfiguration-with-VS -provided-solution-config-XML 过程之一)。

【讨论】:

  • 标记为答案,但我选择了不同的解决方案。
【解决方案2】:

我在 VS2012 中遇到过类似的事情。对我来说,这与在构建期间将AssignProjectConfiguration 目标的ShouldUnsetParentConfigurationAndPlatform 属性设置为true 有关。这导致“GlobalPropertiesToRemove = Configuration;Platform”导致配置和平台属性被清除以供项目参考。

在设置工具 -> 选项 -> 项目和解决方案 -> 构建和运行 -> MSBuild 项目构建输出详细程度 -> 诊断后查看构建输出窗口,我能够看到这种情况。

使用空白配置/平台,这导致我的一些项目中的以下行匹配,从而导致项目输出中的调试程序集即使在发布版本中:

<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

解决方案是修改那些 csproj 文件以指定 Release 作为配置变量为空/空白时使用的配置:

<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多