У меня ниже настройка файла MSBuild Target. Это отлично работает с одним файлом JSON.

<Target Name="dev" 
            AfterTargets="PrepareForBuild"
            BeforeTargets="BeforeBuild"
            Condition="$(Configuration) != 'Debug'">  

        <Message Text="Building Application (dev.json)" />

        <ItemGroup>
            <ScriptFile Include="$(MSBuildThisFileDirectory)myscript.ps1" />
    </ItemGroup>
    <ItemGroup>
            <ScriptArgs Include="-Source &quot;$(MSBuildProjectDirectory)&quot;" />
            <ScriptArgs Include="-PathToManifest &quot;$(MSBuildProjectDirectory)\test\dev.json&quot;" />
        </ItemGroup>

        <Exec  Command="powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File &quot;@(ScriptFile)&quot; @(ScriptArgs,' ')" 
               Condition="Exists('@(ScriptFile)')" />
        <Error Condition="!Exists('@(ScriptFile)')"
               Text="Script file: &quot;@(ScriptFile)&quot; not found. Existing dev.json incomplete!" />

    </Target>

Я проверил несколько вопросов здесь, но мне не помогло размещение здесь. Как мне добавить это в цикл, чтобы я мог запускать один и тот же скрипт с разными файлами JSON?

Я настроил test\dev.json, и у меня есть test.json, prod.json.

Все остается прежним, но входной файл должен пройти цикл.

Я попробовал предложение, приведенное ниже, но все еще не сработало.

 <ItemGroup>
        <MyJsonFile Include="dev.json" />
        <MyJsonFile Include="test.json" />
        <MyJsonFile Include="prod.json" />
 </ItemGroup>
 <ItemGroup>
        <ScriptFile Include="$(MSBuildThisFileDirectory)myscript.ps1" />
 </ItemGroup>
 <ItemGroup>
        <ScriptArgs Include="-Source &quot;$(MSBuildProjectDirectory)&quot;" />
        <ScriptArgs Include="-PathToManifest &quot;$(MSBuildProjectDirectory)\test\%(MyJsonFile.Identity)&quot;" />
    </ItemGroup>
<Target Name="dev" 
            AfterTargets="PrepareForBuild"
            BeforeTargets="BeforeBuild"
            Condition="$(Configuration) != 'Debug'">  
<Exec  Command="powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File &quot;@(ScriptFile)&quot; @(ScriptArgs,' ')" 
               Condition="Exists('@(ScriptFile)')" />
        <Error Condition="!Exists('@(ScriptFile)')"
               Text="Script file: &quot;@(ScriptFile)&quot; not found. Existing dev.json incomplete!" />

    </Target>

Я получил

Невозможно проверить аргумент для параметра 1> «PathToManifest».

Я попытался переместить свою группу элементов ScriptArgs в Target, но это дает еще одну ошибку.

Невозможно привязать параметр, поскольку параметр 1> PathToManifest указан более одного раза. Чтобы предоставить несколько значений параметрам, которые могут принимать несколько значений 1>, используйте синтаксис массива.

1
daffyduck 1 Ноя 2018 в 00:02

1 ответ

Лучший ответ

Как зациклить целевой файл MSBuild с разными файлами?

Вы можете добавить эти разные файлы JSON в ItemGroup, а затем использовать метаданные элемента MSBuild Identity для циклического зацикливания этих входных файлов, например:

  <ItemGroup>
    <MyJsonFile Include="test.json" />
    <MyJsonFile Include="dev.json" />
    <MyJsonFile Include="prod.json" />
  </ItemGroup> 

Затем используйте %(MyJsonFile.Identity), чтобы зациклить эти входные файлы:

<ItemGroup>
        ...
        <ScriptArgs Include="-PathToManifest &quot;$(MSBuildProjectDirectory)\test\%(MyJsonFile.Identity)&quot;" />

</ItemGroup>

Проверьте этот поток для более подробной информации.

Надеюсь это поможет.

1
Community 20 Июн 2020 в 09:12