2012-12-23 65 views
2

我想使用Powershell「Publish-AzureServiceProject」cmdlet發佈一個Node.js包到Azure。Publish-AzureServiceProject Node.js到Windows Server 2012

使用默認osFamily = 「2」(在Windows Server 2008 R2),它按預期工作,但是當我發佈使用osFamily = 「3」(Windows Server 2012中)我得到以下錯誤:

The feature named NetFx35 that is required by the uploaded package is not available in the OS * chosen for the deployment.

很明顯,我沒有使用.Net,但3.5是默認設置,可以阻止我上傳軟件包。

要指定.NET 4.5,我讀了,我需要創建一個包含roleproperties.txt文件:

TargetFrameWorkVersion=v4.5

,並通過A/rolePropertiesFile把它傳遞給cspack。

但是,由於我沒有自己調用cspack,我怎麼能通過Publish-AzureServiceProject將該選項傳遞給cspack?還是有另一種解決方法?


目前我的服務定義是這樣的:

<?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 &gt; 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> 

回答

1

所以目前,有需要做一些工作才能使OSFamily = 3與非.NET角色一起工作。本質上,你需要自己運行cspack來創建一個包並指定一個允許你定位.Net 4.5的角色屬性文件(是的,即使你根本沒有使用.Net,你也需要說服cspack工具,重新使用.Net 4.5)。

步驟如下:

  1. 去創建一個Web角色一個新的節點項目。
  2. 修改cscfg以設置OS Family = 3.
  3. 將以下roleproperties.txt放入服務的根目錄中。
  4. 啓動「Windows Azure命令提示符」,然後轉到服務根文件夾。
  5. 運行以下命令:cspack ServiceDefinition.csdef中/角色:WebRole1; WebRole1 /網站:WebRole1;網絡; WebRole1 /rolePropertiesFile:WebRole1;RoleProperties.txt到門戶網站/out:package.cspkg
  6. 登錄並創建服務/上傳cspkg手動

roleproperties.txt的內容:

TargetFrameworkVersion=v4.5

+0

謝謝我實際上已經明白了這一點。我仍然缺少的是從命令行上傳軟件包的方法。這可能嗎? – laktak

+2

是的,您可以使用new-AzureService上傳cspkg來創建不帶部署的服務,然後使用New-AzureDeployment爲您提供cspkg文件。 –

+0

哎呀,回來了,並試圖再次upvote。這個信息是無價的,謝謝你的謝謝! –

1

爲節點SDK構建一個軟件包,而無需使用cspack.exe(保持平臺獨立架構),你不能使用「/ rolePropertiesFile」選項。

至於解決方法,你可以設置使用運行的targetFrameworkVersion設置 - >入口點 - > NetFxEntryPoint - > 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 &gt; 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> 
+0

謝謝你但是我不使用.NET中的信息,所以我的入口點已經包含了一個。當我嘗試添加NetFxEntryPoint時,出現錯誤:「無法找到服務描述。」 – laktak

+0

我只是在沒有ProgramEntryPoint的情況下在本地快速嘗試NetFxEntryPoint(上面更新了確切的ServiceDefinition),並且它在本地工作。所以在我看來,即使你沒有Role DLL,你仍然可以用這種方式指定TargetFrameWorkVersion,並且由於IISnode配置是在啓動任務中完成的,所以dummy entrypoint dll將不會執行任何操作。這可能讓你傳遞你的錯誤。 – AvkashChauhan

+1

我沒有使用IISNODE。我使用WorkerRole自己開始幾個節點進程。你是正確的,它沒有ProgramEntryPoint,但我的節點進程不會運行。 – laktak

相關問題