使用MSBuild项目与解决方案的相对路径

5
我有许多项目组成一个解决方案。每个项目都有自己的目录结构,csproj文件位于不同级别的文件夹中。
每个csproj都指定了OutputPath属性。 OutputPath是相对路径,它因项目而异,以使所有项目具有相同的输出目录。
如果我构建单独的项目,它可以正常工作。但是,如果我尝试构建解决方案文件,则一切都会改变。在这种情况下,每个项目的输出文件夹不同(取决于该项目OutputPath中'..'的数量)。
我知道,在某个时刻之前,一切都运行良好。 没有人更改build.cmd或任何sln或csproj文件。 但现在我遇到了上述情况。
所以我的问题是 - 是什么影响了相对路径的计算?我的意思是如何强制相对OutputPath从特定项目的csproj文件所在的文件夹开始计算。 而不是从.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',与a.csproj相同 - 如果从b.csproj计算,它刚好在dir1的上层。

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

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

2个回答

4

好的,我找到了导致这个问题的原因。那是一个自定义的.targets文件,在任何msbuild开始时推断SolutionDir属性。 我通过使用MSBuild Explorer找出了这一点。这个工具在我的情况下非常有用-我不知道我系统上有第三方的.target文件。


我遇到了相同的根本原因(覆盖 $(OutputPath)),但问题却非常不同(*.designer.cs 文件停止重新生成)- 在 5 分钟内使用 MSBuild Explorer 进行了诊断。 - Darko

2

Msbuild Import Element description中:

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

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

如果您在问题中添加更多详细信息或示例,那么就更容易理解确切的问题。

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

第二步 - 在生成sln文件时,将其转换为msbuild项目文件格式并存储在临时文件中。如果您在cmd中执行“set msbuildemitsolution=1”,然后通过命令行触发构建,就可以获取该临时文件。在那里,您可以检查该文件并查看如何调用各个项目。但我想你会看到多个.csproj />条目。以及由这些调用继承的全局msbuild属性。
所以我怀疑,如果之前一切正常,并且没有进行任何更改-您可能缺少OutputPath环境变量或其他有助于构建OutputPath的变量。
顺便说一句 - 我认为,如果您想使用$(MSBuildProjectDirectory)来修复强制相对目录的问题。这是msbuild保留属性之一(来自here),但这将要求您在每个csproj文件中调整OutputPath。我个人更喜欢避免这样做,因为它可能会影响其他目标并引入微妙的问题。

不确定您所谓的导入项目是什么意思,但在我的情况下,所有相对路径都是相对于解决方案文件目录进行解释的。我也不确定如何更改这一点... - DarkDeny
谢谢你的帮助,但我已经解决了问题并在我的回答中提到了。无论如何感谢你的参与! - DarkDeny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接