2010-05-20 49 views
1

我有一个包含下列项目.NET解决方案:环境变量迷路之间的MSBuild项目

  • Web应用程序(WAP)
  • Web部署(WDP,.wdproj)
  • 威克斯设置(WIX, .wixproj)

在WDP中,我使用了一个自定义的MSBuild任务(SetEnvVar)来设置一些env。变量在构建过程中进一步使用。设置它们之后,我可以毫无疑问地使用它们。 在WDP中,但在WIX中它们是空的/未定义的。奇怪的是,当我参考那些环境。 VIX文件中的变量(使用.wxs中的属性或.wxi中的预处理变量)我按照预期得到值。

你有什么想法为什么env。变量会丢失/未在.wixproj中定义?

由(解决方案)构建过程是从内部更新VS 2010

触发方式

这基本上是我的任务代码:

Environment.SetEnvironmentVariable(this.Variable, this.Value); 

是一个MSBuild的解决方案生成不是一个过程?

MSBuild是否会为解决方案中的每个项目生成一个新进程?

+0

当然如果有问题的答案会很好!我希望WiX不在一个单独的过程中运行,因为我希望和DotNetter完全一样。 :) – Dave 2013-04-17 06:07:14

回答

1

是否有可能你的SetEnvVar任务设置单个进程而不是全局环境变量(它应该做的是安全的顺便说一句)?在这种情况下,WIX thingie很可能以某种方式作为一个不同的进程启动,因此它拥有当前全局环境集的私有副本。

+0

“全局”你可能意味着使用第二个SetEnvironmentVariable()重载并将第三个参数(目标)设置为用户/机器? 其实我不想env。变量要坚持在注册表中,我只需要在整个MSBuild解决方案构建过程中使用它们。 – DotNetter 2010-05-21 08:40:06

+0

第三个参数可以在全局范围内设置,但最好不要这样做,因为它会影响整个系统。 你可以使用详细信息运行你的构建?我真的怀疑构建的一部分是作为不继承环境的另一个过程而产生的。通过显示诊断信息,您可以找出发生的情况,也可以找到一种方式来传递环境。 – stijn 2010-05-21 08:50:59

+0

Thx的提示,我会尝试。 – DotNetter 2010-05-21 09:04:31

0

以下是项目文件的显著部分:

WDP(.wdproj)

<Target Name="AfterBuild"> 
    <SetEnvVar Variable="MAJOR" Value="$(MajorNumber)" /> 
    <SetEnvVar Variable="MINOR" Value="$(MinorNumber)" /> 
    <SetEnvVar Variable="REVISION" Value="$(RevisionNumber)" /> 
    <SetEnvVar Variable="BUILD" Value="$(BuildNumber)" />   
</Target> 

维克斯(.wixproj)

<Target Name="AfterBuild"> 
    <Message Text="Major: $(MAJOR) Minor: $(MINOR) Revision: $(REVISION)" /> 
    <Move SourceFiles=".\bin\$(Configuration)\$(OutputName).msi" DestinationFiles=".\bin\$(Configuration)\Product_$(MAJOR).$(MINOR).$(REVISION).msi" />   
</Target> 

消息任务日志输出为“Major:Minor:Revision:” the refore MAJOR,MINOR和REVISION变量不适用于WIX项目,因此MSI软件包名称为Product _... msi

项目构建顺序当然是WAP - > WDP - > WIX。

+0

看起来不错;唯一我能想到的是,VisualStudio为每个项目文件产生了1个msbuild进程。你能检查这个,比如在任务管理器中吗? – stijn 2010-05-24 10:35:24