Ответ 1
Это сообщение решило мою проблему: http://michaelcollier.wordpress.com/2013/01/14/multiple-sites-in-a-web-role/
A необходимо прочитать, если у вас есть несколько веб-сайтов на одном веб-сайте!
У меня есть решение с проектом Windows Azure Cloud Services, который отлично компилируется из VS и командной строки.
Если я пытаюсь сделать пакет, он отлично работает с VS, но не работает из командной строки.
Вот моя командная строка из Powershell:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe .\project.sln --%
/p:Configuration="QA" /p:TargetProfile="CloudQA" /p:Platform="Any CPU" /target:Publish
/nr:false
У меня есть эта ошибка:
"C:\CI\project\project.sln" (Publish target) (1) ->
"C:\CI\project\WindowsAzure\WindowsAzure.ccproj.metaproj" (Publish target) (11) ->
"C:\CI\project\WindowsAzure\WindowsAzure.ccproj" (Publish target) (12) ->
(PrepareRoleItems target) ->
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Windows Azure Tools\2.0\Microsoft.WindowsAzure.targets(13
02,5): error MSB4096: The item "C:\CI\project\project.WebAPI\project.WebAPI.csproj" in item list "Projec
tReferenceWithConfiguration" does not define a value for metadata "Name". In order to use this metadata, either qualif
y it by specifying %(ProjectReferenceWithConfiguration.Name), or ensure that all items in this list define a value for
this metadata. [C:\CI\project\WindowsAzure\WindowsAzure.ccproj]
ИЗМЕНИТЬ Немногие интересные вещи: Вот мой файл csdef
<WorkerRole name="ProjectWorker" vmsize="ExtraSmall">
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
<Endpoints>
<InternalEndpoint name="InternalEndpoint1" protocol="http" />
</Endpoints>
<ConfigurationSettings>
</ConfigurationSettings>
</WorkerRole>
<WebRole name="Project.Web" vmsize="ExtraSmall">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="http" endpointName="http" />
</Bindings>
</Site>
<Site name="Api" physicalDirectory="..\..\..\Project.WebAPI">
<Bindings>
<Binding name="http" endpointName="http81" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="http" protocol="http" port="80" />
<InputEndpoint name="http81" protocol="http" port="81" />
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
</WebRole>
Как вы можете видеть, у меня есть два веб-сайта на одном веб-сервере.
Теперь давайте посмотрим на файл ccproj:
<ItemGroup>
<ProjectReference Include="..\Project.Web\Project.Web.csproj">
<Name>Project.Web</Name>
<Project>{5d000123-0000-4b6e-b5fa-72525afca7f5}</Project>
<Private>True</Private>
<RoleType>Web</RoleType>
<RoleName>Project.Web</RoleName>
<UpdateDiagnosticsConnectionStringOnPublish>True</UpdateDiagnosticsConnectionStringOnPublish>
</ProjectReference>
<ProjectReference Include="..\ProjectWorker\ProjectWorker.csproj">
<Name>ProjectWorker</Name>
<Project>{22e99999-1000-4559-8507-a948b7e3d1b0}</Project>
<Private>True</Private>
<RoleType>Worker</RoleType>
<RoleName>ProjectWorker</RoleName>
<UpdateDiagnosticsConnectionStringOnPublish>True</UpdateDiagnosticsConnectionStringOnPublish>
</ProjectReference>
</ItemGroup>
В ccproj вместо 3 ссылаются только два проекта.
Проект облака имеет 3 зависимости в sln.
Если у меня была ссылка вручную в ccproj, как это:
<ProjectReference Include="..\Project.WebAPI\Project.WebAPI.csproj">
<Name>Project.Web</Name>
<Project>{A0F88888-3333-4823-A34F-5F01F0A3FFFF}</Project>
<Private>True</Private>
<RoleType>Web</RoleType>
<RoleName>Project.WebAPI</RoleName>
<UpdateDiagnosticsConnectionStringOnPublish>True</UpdateDiagnosticsConnectionStringOnPublish>
</ProjectReference>
У меня есть эта ошибка:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Windows Azure Tools\2.0
\Microsoft.WindowsAzure.targets(987,5): error : CloudServices25 : Multiple directories are
specified for role Project.Web. [C:\CI\project\WindowsAzure\WindowsAzure.ccproj]
Теперь, если я обновляю ссылку следующим образом:
<ProjectReference Include="..\Project.WebAPI\Project.WebAPI.csproj">
<Name>Project.WebAPI</Name>
<Project>{A0F88888-3333-4823-A34F-5F01F0A3FFFF}</Project>
<Private>True</Private>
<RoleType>Web</RoleType>
<RoleName>Project.Web</RoleName>
<UpdateDiagnosticsConnectionStringOnPublish>True</UpdateDiagnosticsConnectionStringOnPublish>
</ProjectReference>
У меня есть эта ошибка:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Windows Azure Tools\2.0
\Microsoft.WindowsAzure.targets(987,5): error : CloudServices26 : Cannot find role
named 'Project.WebAPI' in service description file
C:\CI\project\WindowsAzure\bin\UAT\ServiceDefinition.csdef.
[C:\CI\project\WindowsAzure\WindowsAzure.ccproj]
Это сообщение решило мою проблему: http://michaelcollier.wordpress.com/2013/01/14/multiple-sites-in-a-web-role/
A необходимо прочитать, если у вас есть несколько веб-сайтов на одном веб-сайте!
Я нашел эту ссылку: Сообщение об ошибке Visual Studio 2010 Beta 2 myTODO, это работает для меня. Ценная информация по этой ссылке:
Кажется, что Azure не нравится, если вы указываете что-либо помимо проекта Azure Role в качестве зависимости от проекта службы. Я сделал так, чтобы MyWebRole.csproj зависел от xxx.csproj, а не от MyService.ccproj, зависящего от xxx.csproj, и он работал.
Я наткнулся на аналогичную проблему при создании моего проекта облака из командной строки, в частности получаю это исключение, если веб-проект, на который ссылается тег VirtualDirectory
, помечен как зависимость сборки для проекта облака.
Чтобы избежать этого и убедиться, что веб-проект скомпилирован и включен в cspack
, я придумал процедуру проще, чем приведенная в ответ Swell - в частности, не требуется изменять файлы проекта, а только для вызова двух целей в точном порядке:
Configuration Manager
, что веб-проект будет перестроен в желаемой конфигурации решения (например, убедитесь, что он построен в конфигурации Release
);выполните перестройку решения, например
MsBuild solution.sln /t:Rebuild ...
Таким образом, веб-проект будет перекомпилирован.
выполнить публикацию облачного проекта, например
MsBuild solution.sln /t:cloudproject.ccproj:publish ...
Веб-проект будет скопирован правильно в файл cspack
.