Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 MSBuild项目与解决方案的相对路径_Visual Studio 2010_Msbuild - Fatal编程技术网

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

Visual studio 2010 MSBuild项目与解决方案的相对路径,visual-studio-2010,msbuild,Visual Studio 2010,Msbuild,我有许多项目都加入到解决方案中。每个项目都有自己的目录结构,csproj文件位于文件夹结构的不同级别。 每个csproj都指定了OutputPath属性。OutputPath-是一个相对路径,它因项目而异,因此所有项目都具有相同的输出目录。 如果我建立一个单独的项目,这是可行的。但如果我尝试构建解决方案文件,一切都会发生变化。在这种情况下,每个项目输出文件夹都不同(取决于该项目输出路径中的“..\”数量) 我知道,在某个时刻之前,一切都很顺利。没有人更改build.cmd或任何sln或cspro

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

我知道,在某个时刻之前,一切都很顺利。没有人更改build.cmd或任何sln或csproj文件。但现在我有上述情况

所以我的问题是-什么影响相对路径的计算?我的意思是如何强制从特定项目的csproj文件所在的文件夹开始计算相对输出路径。不是来自.sln文件所在的文件夹

Let's assume I have following directory structure:

dir1
  a.sln
  dir2
    a.csproj
  dir21
    dir3
      b.csproj
a、 csproj的输出路径设置为“../../\u bin”,如果从.csproj文件夹中计数,则该路径刚好高于dir1 b、 csproj的输出路径设置为“../../../../\u bin”,这是相同的-如果从b.csproj计算,则大约为dir1

a、 sln同时包含-a.csproj和b.csproj

当我运行msbuild时,我得到一个到“dir1/../../../../\u-bin”的项目生成和一个到“dir1/../../../../../\u-bin”的项目生成-项目文件的两个相对路径都是从解决方案文件位置开始计算的,而不是从项目文件开始计算的。

导入项目中的相对路径是相对于 导入项目的目录。因此,如果项目文件是 导入到不同位置的多个项目文件中时 将解释导入的项目文件中的相对路径 对于每个导入的项目都有不同的定义

与项目文件相关的所有MSBuild保留属性,例如MSBuildProjectDirectory 以及导入项目中引用的MSBuildProjectFile 基于导入项目文件指定的值

若你们在你们的问题中加入更多的细节或者很少的样本,那个么你们就更容易理解确切的问题了

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

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

所以我怀疑在某一点之前是否一切都很好,并且并没有做任何更改—您缺少OutputPath环境变量或其他有助于构建OutputPath的变量


顺便说一句,我认为如果您想通过强制使用相对目录来解决问题,还可以使用$(MSBuildProjectDirectory)。这是msbuild保留属性之一(从),但这将要求您调整每个csproj文件中的OutputPath。就我个人而言,我更愿意避免这种情况,因为它可能会影响其他一些目标,并带来一些微妙的问题。

好吧,我能够找到导致这种情况的原因。这是custom.targets文件,它在任何msbuild的开始处推断SolutionDir属性。
我确实通过使用MSBuild资源管理器发现了这一点。该工具在我的情况下非常有用-我不知道我的系统上有第三方.target文件。

不确定导入的项目是什么意思,但在我的情况下,所有相对路径都是相对于解决方案文件目录进行解释的。我不知道如何改变这一点……谢谢你们的帮助,但我解决了这个问题,并在我自己的回答中提到了这一点。不过还是要感谢大家的参与+1000我有相同的根本原因(覆盖$(OutputPath)),但有非常不同的问题(*.designer.cs文件已停止重新生成)-在5分钟内通过MSBuild Explorer进行诊断。