为什么我可以在csproj文件中的某些元素中使用某些环境变量而在msbuild中不使用其他元素?

时间:2010-08-04 18:41:53

标签: msbuild makefile environment-variables

出于以下奇怪行为可能有什么原因,以及如何追踪问题?

我们使用make文件和msbuild的组合。

我有一个需要强烈命名的项目。我以前在项目文件中设置了snk,如下所示:

<AssemblyOriginatorKeyFile>$(EnvironmentVariable)TheKeyName.snk</AssemblyOriginatorKeyFile> 

其中在批处理文件中定义了EnvironmentVariable,该文件为构建启动了shell,如下所示:

set EnvironmentVariable='SomePath'

这个工作正常。现在我需要能够更改字符串名称键,因此在开发机器和发布构建服务器上可能会有所不同。存在一个变量,用于保存强名称密钥文件的完整路径,称为StrongNameKeyFile。这是在msbuild环境中定义的,如果我将一些文本输出放在作为构建项目的msbuild任务的一部分的目标或属性文件中,那么我可以看到此StrongNameKeyFile指向正确的位置。所以我改变了csproj来改为:

<AssemblyOriginatorKeyFile>$(StrongNameKeyFile)</AssemblyOriginatorKeyFile>

但是当我尝试编译时,这是评估为空,并且在构建期间没有指定/ keyfile。

我们还在make文件中定义了变量,这些变量也可以在csproj中访问。这些用于指向引用的dll的位置,以便它们在开发和构建机器上可以是不同的。我知道这些是在引用正确且一切都编译时设置的,但如果我尝试在AssemblyOriginatorKeyFile元素中使用其中一个变量,那么它在该元素中求值为空,但在引用元素中有效。

为什么会这样? AssemblyOriginatorKeyFile是以某种方式特别处理的吗?我怎样才能追踪这种原因?

1 个答案:

答案 0 :(得分:2)

没有充分的理由说明为什么会发生这种情况 - 因为你知道它通常只是工作;它很可能会成为链中的东西。

要尝试的一件事是通过/ p:StrongNameKeyFile = XX显式传递它 - 这将消除环境变量以及从您的查询中正确传播。

另一个潜在的事情是,当某个名称被用于其他东西时,有些东西正在破坏变量吗?

使用/ v:diag运行,您将获得所有输入和/或变量的转储。

或者如果在V4上,请使用MSBuild Debugger

并购买Hashimi et al MSBuild book