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

时间:2013-02-08 15:13:23

标签: visual-studio-2010 msbuild

我有很多项目都加入了解决方案。每个项目都有自己的目录结构,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' - 项目文件的相对路径都是从解决方案文件位置计算,而不是项目文件。

2 个答案:

答案 0 :(得分:3)

好吧,我能够找出造成这种情况的原因。这是自定义.targets文件,它在任何msbuild的开头都推断出SolutionDir属性。 我确实通过使用MSBuild Explorer找到了它。事实证明这个工具在我的案例中非常有用 - 我不知道我系统上的第三方.target文件。

答案 1 :(得分:2)

来自Msbuild Import Element description

  

导入项目中的相对路径相对于   导入项目的目录。因此,如果是项目文件   导入到不同位置的几个项目文件中   将解释导入的项目文件中的相对路径   每个导入项目的方式不同。

     

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

如果您在问题中添加更多详细信息或少量示例,则可以更轻松地了解确切问题。

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

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

所以我怀疑如果在某些点之前一切正常并且没有进行任何更改 - 您缺少OutputPath环境变量或其他一些有助于构造OutputPath的变量。

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

相关问题