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

Я использую Azure SDK 2.5. У меня есть веб-роль в проекте облачной службы. Я хотел бы каким-то образом добавить папку, чтобы она была развернута в родительском каталоге approot. Я не нашел способ сделать это, что заставляет меня задаться вопросом, какая польза от возможности определять виртуальные каталоги в 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. Втф!? Как заставить это работать? Это работает, если я ввожу абсолютный путь с указанием полного диска.


person Sam    schedule 15.01.2015    source источник


Ответы (2)


Поэтому я решил эту проблему, заставив 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 var, так как вы можете легко переопределить его в различных сценариях сборки, переопределив значение (например, /p:FrontendDir="c:\foo")

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

person Sam    schedule 15.01.2015
comment
Если ты когда-нибудь поедешь в Грузию, я должен тебе пива... и обнять! Спасибо, это было очень полезно - person ewitkows; 04.05.2018
comment
Хаха круто. Пришлось проверить ваш профиль, чтобы убедиться, что вы не имели в виду бывшую советскую Грузию ???? - person Sam; 06.05.2018

Вы видите ту же ошибку, но из разных целей 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 SDK\Azure.NET SDK\v2.9\bin\ServiceDescription.dll, вы увидите, что метод ProcessRoleContents выполняет проверку, но использует SourceFile для решения проблемы. место нахождения.

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

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

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

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

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

person Michael Blake    schedule 23.05.2019