MSBuild AL (компоновщик сборок) проблема синхронизации?

Я пытаюсь использовать задачу AL в своем скрипте MSBuild, и каждый раз, когда я запускаю ее, я получаю разные результаты.

<Target Name="Build"> 
    <PropertyGroup>
        <RootFolder>$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))</RootFolder>
        <TempDirectory>$(MSBuildProjectDirectory)\temp</TempDirectory>
        <WebsiteDirectory>$(RootFolder)\httpdocs\bin</WebsiteDirectory>
    </PropertyGroup> 

    <ItemGroup>
        <ResourceFilesToDelete Include="$(TempDirectory)\**\*.resources"/>
        <LibraryFilesToCopy Include="$(TempDirectory)\**\*.dll"/>
    </ItemGroup>

    <!-- English translations -->
    <MakeDir Directories="$(TempDirectory)" Condition="!Exists('$(TempDirectory)')"/>
    <GenerateResource Sources="$(MSBuildProjectDirectory)\sitetext.txt" OutputResources="$(TempDirectory)\sitetext.resources"/>
    <AL EmbedResources="$(TempDirectory)\sitetext.resources" OutputAssembly="$(TempDirectory)\sitetext.dll"/>

    <Copy SourceFiles="@(LibraryFilesToCopy)" DestinationFolder="$(WebsiteDirectory)\%(RecursiveDir)"/>
    <Delete Files="@(ResourceFilesToDelete)"/>
</Target>

У меня в основном есть текстовый файл, я хочу преобразовать его в ресурс (работает), а затем создать из него dll (работает), но это всегда конечные задачи копирования и удаления, которые очень случайны. Есть ли проблема синхронизации с задачами AL? Есть ли способ сделать паузу, пока они не закончили?

1 ответ

Решение

Основная причина заключается в том, что коллекция элементов LibraryFilesToCopy заполнена ПЕРЕД созданием сборки $(TempDirectory)\sitetext.dll. Исправить это просто:

<!-- English translations -->
<MakeDir Directories="$(TempDirectory)" Condition="!Exists('$(TempDirectory)')"/>
<GenerateResource Sources="$(MSBuildProjectDirectory)\sitetext.txt" OutputResources="$(TempDirectory)\sitetext.resources"/>
<AL EmbedResources="$(TempDirectory)\sitetext.resources" OutputAssembly="$(TempDirectory)\sitetext.dll"/>

<ItemGroup>
    <ResourceFilesToDelete Include="$(TempDirectory)\**\*.resources"/>
    <LibraryFilesToCopy Include="$(TempDirectory)\**\*.dll"/>
</ItemGroup>

<Copy SourceFiles="@(LibraryFilesToCopy)" DestinationFolder="$(WebsiteDirectory)\%(RecursiveDir)"/>
<Delete Files="@(ResourceFilesToDelete)"/>
Другие вопросы по тегам