我正在尝试使用Powershell“Publish-AzureServiceProject”cmdlet将Node.js包发布到Azure。
使用默认的osFamily =“2”(Windows Server 2008 R2),它按预期工作,但是当我使用osFamily =“3”(Windows Server 2012)发布时,我收到以下错误:
上传的软件包所需的名为NetFx35的功能是 在为部署选择的OS *中不可用。
显然我没有使用.Net,但默认情况下,3.5是阻止我上传软件包的。
要指定.Net 4.5我读到我需要创建一个包含以下内容的roleproperties.txt文件:
TargetFrameWorkVersion = 4.5版
并通过/ rolePropertiesFile将其传递给cspack。
但是,由于我自己并没有调用cspack,我如何通过Publish-AzureServiceProject将该选项传递给cspack?或者还有另一种解决方法吗?
目前我的ServiceDefinition看起来像这样:
<?xml version="1.0"?>
<ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Foo" upgradeDomainCount="1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WorkerRole name="Bar">
<Imports>
<Import moduleName="RemoteForwarder" />
<Import moduleName="RemoteAccess" />
</Imports>
<Startup>
<Task commandLine="setup_worker.cmd > log.txt" executionContext="elevated">
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="RUNTIMEID" value="node" />
<Variable name="RUNTIMEURL" value="http://nodertncu.blob.core.windows.net/node/0.6.20.exe" />
</Environment>
</Task>
</Startup>
<Endpoints>
<InputEndpoint name="HttpIn" protocol="tcp" port="80" />
</Endpoints>
<Runtime>
<Environment>
<Variable name="PORT">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='HttpIn']/@port" />
</Variable>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
</Environment>
<EntryPoint>
<ProgramEntryPoint commandLine="runnode.cmd" setReadyOnProcessStart="true" />
</EntryPoint>
</Runtime>
</WorkerRole>
</ServiceDefinition>
答案 0 :(得分:1)
由于Node SDK在不使用cspack.exe的情况下构建软件包(以保持独立于平台的架构),因此无法使用“/ rolePropertiesFile”选项。
作为解决方法,您可以使用运行时 - &gt;设置targetFrameworkVersion设置。 EntryPoint - &gt; NetFxEntryPoint - &gt;您的ServiceDefinition中的targetFrameworkVersion =“v4.5”,如下例所示:
<?xml version="1.0"?>
<ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="NodeAvkash" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="WebRole1" vmsize="ExtraSmall">
<Imports />
<Startup>
<Task commandLine="setup_web.cmd > log.txt" executionContext="elevated">
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="RUNTIMEID" value="node;iisnode" />
<Variable name="RUNTIMEURL" value="http://nodertncu.blob.core.windows.net/node/0.6.20.exe;http://nodertncu.blob.core.windows.net/iisnode/0.1.21.exe" />
</Environment>
</Task>
</Startup>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
</Sites>
<Runtime executionContext="elevated">
<EntryPoint>
<NetFxEntryPoint assemblyName="WebRole1.dll" targetFrameworkVersion="v4.5" />
</EntryPoint>
</Runtime>
</WebRole>
</ServiceDefinition>
答案 1 :(得分:1)
目前,您需要做一些工作才能让OSFamily = 3使用非.Net角色。基本上,你需要自己运行cspack来创建一个包,并指定一个roleProperties文件,允许你定位.Net 4.5(是的,即使你根本不使用.Net,你需要说服cspack工具你'重新使用.Net 4.5)。
以下是步骤:
roleproperties.txt的内容:
TargetFrameworkVersion=v4.5