Добавление дополнительных папок содержимого в пакет Azure

Я использую Azure SDK 2.5 У меня есть веб-роль в проекте облачного сервиса. Я хотел бы добавить папку таким образом, чтобы она была развернута в родительском каталоге приложения. Я не нашел способ сделать это, что заставляет меня задуматься, зачем использовать возможность определять виртуальные каталоги в csdef.

Поэтому я решил попробовать добавить папки через конфигурацию Contents/Content xml в csdef. Я либо в корне неправильно понимаю, что делает этот бит конфигурации, либо он безнадежно сломан.

Предполагая эту структуру папок

  /
    /CloudService
    /SomeOtherContent

Если я определю следующее:

<Contents>
      <Content destination="frontend">
        <SourceDirectory path="..\SomeOtherContent" />
      </Content>
    </Contents>

и построить я получаю:

ошибка CloudServices089: не удается найти исходный каталог 'C:\src\template\src\Template.CloudService\bin\Debug\..\SomeOtherContent'

Итак, он запускает bin \ Debug, так что я просто сделаю это..\..\..\SomeOtherContent

ошибка CloudServices089: не удается найти исходный каталог 'C:\src\template\src\Template.CloudService\..\..\..\SomeOtherContent'

Да, верно, папка, в которой разрешен мой относительный путь, изменилась!!! Его больше нет, bin\Debug. Wtf!? Как это можно сделать, чтобы работать? Это работает, если я ввожу полный путь с указанием полного пути.

1 ответ

Решение

Поэтому я решил эту проблему, установив MSBuild для определения пути и вставив его в переменную окружения, которую я назвал FrontendDir.

<Contents>
      <Content destination="frontend">
        <SourceDirectory path="%FrontendDir%" />
      </Content>
    </Contents>

и в ccproj я добавил:

<UsingTask
    TaskName="SetEnvironmentVariableTask"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll">

    <ParameterGroup>
      <Name ParameterType="System.String" Required="true" />
      <Value ParameterType="System.String" Required="true" />
    </ParameterGroup>

    <Task>
      <Using Namespace="System" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
          Environment.SetEnvironmentVariable(Name, Value);
        ]]>
      </Code>
    </Task>
  </UsingTask>
  <Target Name="BeforeBuild" Condition=" '$(FrontendDir)' == '' ">
    <Message Text="Setting Project Dir" Importance="high" />
    <SetEnvironmentVariableTask Name="FrontendDir" Value="$(ProjectDir)\..\Template.FrontEnd\dist" />
  </Target>

Здесь желательно поместить весь путь в переменную env, так как вы можете легко переопределить его в различных сценариях сборки, переопределив значение (например, /p:FrontendDir="c:\foo")

Так что это работает и работает довольно хорошо. Я все еще говорю, что поведение, которое я видел раньше с относительным разрешением пути, меняющим папки... не работает Это просто не работает с относительными путями в любом удобном для использования виде.

Вы видите ту же ошибку, но из разных целей msbuild.

Первая ошибка (при использовании ..\..\) брошен в PreValidateServiceModel который проходит в расположении источника и проверяет путь

ServiceDefinitionFile="@(SourceServiceDefinition)"
ServiceConfigurationFile="@(SourceServiceConfiguration)"

C:\src\Azure\ServiceDefinition.csdef: ошибка CloudServices089: Не удается найти исходный каталог 'C:\src\Azure\..\..\.. \ Installers\' в роли WebHost. [C:\ SRC \Azure\Azure.ccproj]

Завершено создание цели "PreValidateServiceModel" в проекте "Azure.ccproj" - СБОЙ.

Вторая ошибка брошена в ValidateServiceFiles который проходит в целевом местоположении

ServiceDefinitionFile="@(TargetServiceDefinition)"
ServiceConfigurationFile="@(TargetServiceConfiguration)">

C:\src\Azure\bin\Release\ServiceDefinition.csdef: ошибка CloudServices089: Не удается найти исходный каталог 'C:\src\Azure\bin\Release\Installers\' в роли WebHost. [C:\ SRC \Azure\Azure.ccproj]

Завершено создание целевого объекта "ValidateServiceFiles" в проекте "Azure.ccproj" - СБОЙ.

Если вы поразмышляете над C:\Program Files\Microsoft SDKs\Azure.NET SDK\v2.9\bin\ServiceDescription.dll, вы можете увидеть ProcessRoleContents метод, выполняющий проверку, но использующий SourceFile для определения местоположения.

Один из вариантов - убедиться, что целевая папка существует (даже если она пуста) до начала сборки.

Было бы лучше, если бы PreValidation разрешил путь, и когда цель сохранена, у нее был полный путь.

В итоге я отредактировал ccproj и добавил это

<Target Name="BeforeAddRoleContent">
    <ItemGroup>
      <AzureRoleContent Include="Installers\">
        <RoleName>Azure</RoleName>
        <Destination></Destination>
      </AzureRoleContent>
    </ItemGroup>
</Target>

Ссылка на содержимое среды выполнения из.ccproj (Azure SDK 2.9)

Другие вопросы по тегам