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

问题描述 投票:0回答:1

以下奇怪行为可能有哪些原因?我如何找出问题?

我们结合使用 make 文件和 msbuild。

我有一个需要强命名的项目。我之前将 snk 设置为在项目文件中使用,如下所示:

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

环境变量是在启动构建 shell 的批处理文件中定义的,如下所示:

set EnvironmentVariable='SomePath'

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

<AssemblyOriginatorKeyFile>$(StrongNameKeyFile)</AssemblyOriginatorKeyFile>

但是当我尝试编译时,它的计算结果为空,并且在构建过程中未指定 /keyfile。

我们还在 make 文件中定义了变量,这些变量也可以在 csproj 中访问。这些用于指向引用的 dll 的位置,以便它们在开发和构建计算机上可以不同。我知道这些设置是作为引用正确输出并且所有内容都编译的,但是如果我尝试在 AssemblyOriginatorKeyFile 元素中使用这些变量之一,那么它在该元素中计算为空,但在引用元素中工作。

为什么会这样? AssemblyOriginatorKeyFile 是否经过特殊处理?我怎样才能找到造成这种情况的原因?

msbuild makefile environment-variables
1个回答
2
投票

没有充分的理由为什么会发生这种情况——正如你所知,它通常可以正常工作;很可能是链条上的什么东西把它掉到了地板上。

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

另一个潜在的问题是,当名称被其他东西使用时,某些东西正在破坏变量?

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

或者如果在 V4 上,请使用 MSBuild 调试器

并购买 Hashimi 等人的 MSBuild 书

© www.soinside.com 2019 - 2024. All rights reserved.