【问题标题】:Why can I use some environment variables in some of the elements in the csproj file but not others in msbuild?为什么我可以在 csproj 文件中的某些元素中使用某些环境变量,而在 msbuild 中不能使用其他元素?
【发布时间】:2010-08-04 18:41:52
【问题描述】:

以下奇怪行为可能有哪些原因,我该如何追查这些问题?

我们结合使用 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 是否以某种方式进行了特殊处理?我该如何追踪造成这种情况的原因?

【问题讨论】:

  • $(StrongNameKeyFile) 是项目目录的相对路径吗?
  • 不,$(StrongNameKeyFile) 是密钥文件的绝对路径
  • 我认为 AssemblyOriginatorKeyFile 必须是相对于项目文件的路径。
  • 但它与 $(EnvironmentVariable)TheKeyName.snk 配合得很好,这也是一个绝对路径。

标签: msbuild makefile environment-variables


【解决方案1】:

没有充分的理由为什么会发生这种情况 - 正如您所知,它通常只是有效;很可能是链条上的东西掉到地板上。

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

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

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

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

然后购买Hashimi et al MSBuild book

【讨论】:

  • 谢谢,/v:diag 可能正是我想要的。我会尽快尝试的。
猜你喜欢
  • 1970-01-01
  • 2016-11-28
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多