【发布时间】: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