TFS MSBuild:$(ProjectDir)为空或随机

TFS MSBuild:$(ProjectDir)为空或随机,tfs,msbuild,Tfs,Msbuild,我有一个vcproj文件,其中包含一个简单的预构建事件,内容如下: Helpertask.exe $(ProjectDir) 这在开发人员PC上运行良好,但当解决方案在我们的TFS 2008 build服务器上的MSBuild下构建时,$(ProjectDir)要么为空,要么指向服务器上不相关的文件夹 到目前为止,我管理的最佳解决方案是硬编码开发人员和服务器路径: if exist C:\DeveloperCode\MyProject HelperTask.exe C:\Developer

我有一个vcproj文件,其中包含一个简单的预构建事件,内容如下:

Helpertask.exe $(ProjectDir)
这在开发人员PC上运行良好,但当解决方案在我们的TFS 2008 build服务器上的MSBuild下构建时,$(ProjectDir)要么为空,要么指向服务器上不相关的文件夹

到目前为止,我管理的最佳解决方案是硬编码开发人员和服务器路径:

if exist C:\DeveloperCode\MyProject   HelperTask.exe C:\DeveloperCode\MyProject
if exist D:\BuildServerCode\MyProject HelperTask.exe D:\BuildServerCode\MyProject
这种方法适用于后期-构建步骤,但不适用于-构建步骤(在MSBuild下,预构建任务现在什么都不做!)


您对修复或解决方案有什么想法吗?我几乎没有头发了

我认为问题在于构建服务器的工作区可能没有正确初始化。

我只是不断遇到这个问题-我尝试了许多不同的方法,但都以神秘的方式失败了

一旦$(ProjectDir)再次开始正常运行,预构建步骤就停止执行该命令(我在上面和下面添加了echo命令-它们都被执行了,但它们之间的程序没有执行。没有生成任何类型的错误或输出来指示失败的原因)

我不知道这是否是一个狡猾的服务器,如果MSBuild在笑的话


我现在放弃了。我对构建服务器进行了一次大的改进,并改变了策略:我们现在离线(手动)运行这个工具,并检查结果以供构建服务器使用。自动化构建就到此为止:-(如果只有MSBuild能够以与Visual Studio相同的方式运行解决方案,那么它对环境的设置就完全不同了,这真是令人恼火(从解决方案变量中引出的不同路径、重定向到不同的文件夹中,这样您就无法在它们应该在的位置找到它们,等等)

我认为您的问题可能与项的初始化方式有关。项包含属性在生成开始时进行计算。因此,如果您依赖于在生成过程中创建的文件,则必须将其声明为动态项。动态项是指在目标内部或通过使用CreateItem任务定义的项。我已经详细介绍了这一点在我的博客上

赛义德·易卜拉欣·哈希米


我的书:

我分支了一个现有项目,$(ProjectDir)在新分支的代码中保留了旧目录。但那是因为我有一些编译错误。一旦解决方案中的每个项目都编译成功,$(ProjectDir)就改为正确的路径


Carlos A Merighe

$(MSBuildProjectDirectory)为我工作

奇怪的是,这是一个间歇性问题。我几周前看到了它,今天又看到了。在构建步骤中添加了“echo$(ProjectDir)”,它打印出正确的值并重新开始工作。最神秘的是,我开始怀疑它不是$(ProjectDir)已断开,但未执行预构建步骤(它记录正在执行预构建步骤,但构建继续经过该步骤,其中没有执行任何命令)谢谢。问题不在于我们正在创建新文件,而在于创建文件的程序甚至没有被执行。在某一点上,$(ProjectDir)这是完全错误的,但这一定是配置不正确,因为在我处理项目时问题消失了。浪费了一天中最好的时间试图让这个简单的东西工作,我放弃了,并从我们的构建中删除了代码生成步骤-现在这只是开发人员每次更改时必须执行的手动步骤删除源文件(无论如何,这种情况很少见)。如果在实际输入目标文件之前目标文件不可用,您将如何指定目标
输入
输出
相对
项目目录