Azure Project создает пакет, работающий от VS, не работает из командной строки с ошибкой MSB4096

У меня есть решение с проектом 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]

Ответ 2

Я нашел эту ссылку: Сообщение об ошибке Visual Studio 2010 Beta 2 myTODO, это работает для меня. Ценная информация по этой ссылке:

Кажется, что Azure не нравится, если вы указываете что-либо помимо проекта Azure Role в качестве зависимости от проекта службы. Я сделал так, чтобы MyWebRole.csproj зависел от xxx.csproj, а не от MyService.ccproj, зависящего от xxx.csproj, и он работал.

Ответ 3

Я наткнулся на аналогичную проблему при создании моего проекта облака из командной строки, в частности получаю это исключение, если веб-проект, на который ссылается тег VirtualDirectory, помечен как зависимость сборки для проекта облака.

Чтобы избежать этого и убедиться, что веб-проект скомпилирован и включен в cspack, я придумал процедуру проще, чем приведенная в ответ Swell - в частности, не требуется изменять файлы проекта, а только для вызова двух целей в точном порядке:

  • обеспечить в Configuration Manager, что веб-проект будет перестроен в желаемой конфигурации решения (например, убедитесь, что он построен в конфигурации Release);
  • убедитесь, что веб-проект не является зависимостью проекта от облачного проекта;
  • выполните перестройку решения, например

    MsBuild solution.sln /t:Rebuild ...
    

    Таким образом, веб-проект будет перекомпилирован.

  • выполнить публикацию облачного проекта, например

    MsBuild solution.sln /t:cloudproject.ccproj:publish ...
    

    Веб-проект будет скопирован правильно в файл cspack.