5

我有许多项目被加入到一个解决方案中。每个项目都有自己的目录结构,并且 csproj 文件位于不同级别的文件夹结构中。每个 csproj 都指定了 OutputPath 属性。OutputPath - 是一个相对路径,它因项目而异,因此所有项目都具有相同的输出目录。如果我建立一个单独的项目就可以了。但是如果我尝试构建解决方案文件,一切都会改变。在这种情况下,每个项目的输出文件夹都不同(取决于该项目的 OutputPath 中的“..\”数量)。

我知道,在某个时刻之前一切正常。没有人改变 build.cmd 也没有任何 sln 或 csproj 文件。但现在我有上述情况。

所以我的问题是 - 是什么影响了相对路径的评估方式?我的意思是如何强制从该特定项目的 csproj 文件所在的文件夹开始评估相对 OutputPath。不是来自 .sln 文件所在的文件夹。

Let's assume I have following directory structure:

dir1
  a.sln
  dir2
    a.csproj
  dir21
    dir3
      b.csproj

a.csproj 的输出路径设置为“../../_bin”,如果从 a.csproj 文件夹计数,则它位于 dir1 上方 b.csproj 的输出路径设置为“../../../_bin”,其中是相同的 - 如果从 b.csproj 计算,大约是 dir1

a.sln 包含 - a.csproj 和 b.csproj。

当我运行 msbuild 时,我得到一个项目构建到 'dir1/../../_bin' 和 b 项目到 'dir1/../../../_bin' - 项目文件的两个相对路径都从解决方案中计算文件位置,而不是项目文件。

4

2 回答 2

3

好吧,我能够找出造成这种情况的原因。那是自定义 .targets 文件,它在任何 msbuild 开始时推断 SolutionDir 属性。我确实通过使用 MSBuild Explorer 发现了这一点。事实证明,该工具对我来说非常有用——我不知道我的系统上有第三方 .target 文件。

于 2013-02-11T14:07:51.897 回答
2

Msbuild 导入元素描述

导入项目中的相对路径相对于导入项目的目录进行解释。因此,如果将一个项目文件导入到不同位置的多个项目文件中,则导入的项目文件中的相对路径将针对每个导入的项目进行不同的解释。

与项目文件相关的所有 MSBuild 保留属性(例如,在导入项目中引用的 MSBuildProjectDirectory 和 MSBuildProjectFile)均根据导入项目文件分配值。

如果您在问题中添加更多细节或少量示例 - 将更容易理解确切的问题。

编辑:好的,让我们试着找出那个谜。首先 - OutputPath 可能受环境变量的影响。

2nd - 在构建 sln 文件期间转换为 msbuild 项目文件格式并存储在临时文件中。如果您在 cmd "set msbuildemitsolution=1" 中执行,然后通过命令行触发构建,您可以获得该临时文件。在那里您可以检查该文件并查看您的各个项目是如何调用的。但我想你会看到多个 .csproj /> 条目。以及由该调用继承的全局 msbuild 属性。

所以我怀疑在某个时间点之前一切都很好并且没有进行任何更改 - 您缺少 OutputPath 环境变量或其他有助于构建 OutputPath 的变量。

顺便说一句 - 我认为如果你想解决强制相对目录的问题 - 你也可以使用 $(MSBuildProjectDirectory)。这是 msbuild 保留属性之一(来自此处),但这需要您调整每个 csproj 文件中的 OutputPath。我个人更愿意避免的,因为它可能会影响其他一些目标并引入微妙的问题。

于 2013-02-10T11:49:44.997 回答