Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 环境变量在MSBuild项目之间丢失_.net_Visual Studio 2010_Msbuild_Wix_Wix3.5 - Fatal编程技术网

.net 环境变量在MSBuild项目之间丢失

.net 环境变量在MSBuild项目之间丢失,.net,visual-studio-2010,msbuild,wix,wix3.5,.net,Visual Studio 2010,Msbuild,Wix,Wix3.5,我有一个包含以下项目的.NET解决方案: web应用程序(WAP) web部署(WDP、.wdproj) wix设置(wix、.wixproj) 在WDP中,我使用了一个自定义MSBuild任务(SetEnvVar)来设置一些环境。在构建过程中进一步使用的变量。在设置它们之后,我可以毫无疑问地使用它们。 在WDP中,但在WIX中,它们是空的/未定义的。奇怪的是,当我引用那些env时。WIX文件中的变量(通过使用.wxs中的属性或.wxi中的预处理变量),我得到了预期的值 你知道为什么会发生环

我有一个包含以下项目的.NET解决方案:

  • web应用程序(WAP)
  • web部署(WDP、.wdproj)
  • wix设置(wix、.wixproj)
在WDP中,我使用了一个自定义MSBuild任务(SetEnvVar)来设置一些环境。在构建过程中进一步使用的变量。在设置它们之后,我可以毫无疑问地使用它们。 在WDP中,但在WIX中,它们是空的/未定义的。奇怪的是,当我引用那些env时。WIX文件中的变量(通过使用.wxs中的属性或.wxi中的预处理变量),我得到了预期的值

你知道为什么会发生环境污染吗。变量丢失/未在.wixproj中定义

顺便说一下,(解决方案)构建过程是从VS2010内部触发的

更新

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

Environment.SetEnvironmentVariable(this.Variable, this.Value);
MSBuild解决方案生成不是一个进程吗


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

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

您的SetEnvVar任务是否可能为单个进程而不是全局进程设置环境变量(为了安全起见,应该这样做)?在这种情况下,WIX thingie很可能是以某种方式作为一个不同的过程启动的,因此使用它自己的当前全局环境集的私有副本。

以下是项目文件的重要部分:

WDP(.wdproj)


WIX(.wixproj)


消息任务的日志输出为“主要:次要:修订:” WIX项目不提供主变量、次变量和修订变量,因此MSI软件包名称为产品…MSI


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

以下是项目文件的重要部分:

WDP(.wdproj)


WIX(.wixproj)


消息任务的日志输出为“主要:次要:修订:” WIX项目不提供主变量、次变量和修订变量,因此MSI软件包名称为产品…MSI


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

所说的“全局”,您的意思可能是使用第二个SetEnvironmentVariable()重载,并将第三个参数(目标)设置为User/Machine?事实上我不想要环境。要在注册表中持久化变量,我只需要在整个MSBuild解决方案构建过程中使用它们。使用第3个参数,您可以全局设置它,但是最好不要这样做,因为它会影响整个系统。你能用详细的信息运行你的构建吗?我真的怀疑构建的一部分是作为一个不继承环境的不同进程生成的。通过显示诊断信息,您可以找出发生这种情况的地方,并可能找到传递环境的方法。Thx作为提示,我将尝试。我在诊断信息中找不到任何错误或有用的内容。环境变量在WDP的后构建目标(也在前构建之前尝试过)中设置,稍后在WIX的后构建目标中为空。我的结论是,这些项目必须由MSBuild在不同的进程中构建,因此我的环境变量在WDP构建完成后超出范围。为什么我可以引用/使用WIX文件中的变量??“全局”可能是指使用第二个SetEnvironmentVariable()重载并将第三个参数(目标)设置为User/Machine?事实上我不想要环境。要在注册表中持久化变量,我只需要在整个MSBuild解决方案构建过程中使用它们。使用第3个参数,您可以全局设置它,但是最好不要这样做,因为它会影响整个系统。你能用详细的信息运行你的构建吗?我真的怀疑构建的一部分是作为一个不继承环境的不同进程生成的。通过显示诊断信息,您可以找出发生这种情况的地方,并可能找到传递环境的方法。Thx作为提示,我将尝试。我在诊断信息中找不到任何错误或有用的内容。环境变量在WDP的后构建目标(也在前构建之前尝试过)中设置,稍后在WIX的后构建目标中为空。我的结论是,这些项目必须由MSBuild在不同的进程中构建,因此我的环境变量在WDP构建完成后超出范围。为什么我可以引用/使用WIX文件中的变量???看起来不错;我唯一能想到的是VisualStudio为每个项目文件生成1个msbuild进程。。你能检查一下吗(如在任务管理器中)?看起来不错;我唯一能想到的是VisualStudio为每个项目文件生成1个msbuild进程。。你能检查一下这个吗,例如在任务管理器中?如果有这个问题的答案,那当然好了!我希望WiX不会在一个单独的进程中运行,因为我想做与DotNetter完全相同的事情。:)如果这个问题有答案,那当然好了!我希望WiX不会在一个单独的进程中运行,因为我想做与DotNetter完全相同的事情。:)
<Target Name="AfterBuild">
    <SetEnvVar Variable="MAJOR" Value="$(MajorNumber)" />
    <SetEnvVar Variable="MINOR" Value="$(MinorNumber)" />
    <SetEnvVar Variable="REVISION" Value="$(RevisionNumber)" />
    <SetEnvVar Variable="BUILD" Value="$(BuildNumber)" />        
</Target>
<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>