Como faço para verificar se qualquer arquivo em uma lista de itens de existir usando msbuild?
-
03-07-2019 - |
Pergunta
Eu gostaria de executar uma tarefa se algum arquivo em uma lista de itens está faltando. Como posso fazer isso?
Meu script atual tem uma lista de arquivos "fonte" @ (MyComFiles) que traduzem uma outra lista de arquivos "Destino" @ (MyInteropLibs), usando a seguinte tarefa:
<CombinePath BasePath="$(MyPath)\interop"
Paths="@(MyComFiles->'%(filename).%(extension)')">
<Output TaskParameter="CombinedPaths"
ItemName="MyInteropLibs" />
</CombinePath>
Eu quero verificar se algum dos arquivos no @ (MyInteropLibs) está em falta e executar uma tarefa que irá criá-los.
Solução
Eu não sou muito experiente com MSBuild portanto, pode haver soluções melhores do que isso, mas você poderia escrever uma tarefa FilesExist que leva a lista de arquivos e passa cada arquivo para File.Exists retornar verdadeiro se eles existem e falso caso contrário e thenn reagir com base no resultado
Desculpe, não posso fornecer o código para ajudar, minha knowlege de MSBuild sytax não é forte
Outras dicas
Se você só precisa criar os arquivos ausentes, e não obter uma lista dos arquivos que estavam faltando puder lhe a tarefa toque , que irá criar se não existirem os arquivos.
<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" />
Se você só quer criar os arquivos ausentes, e evitar a alteração timestamps dos arquivos existentes, seguida de dosagem pode ajudar
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/>
Se você quer uma lista dos arquivos criados, então
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) ">
<Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/>
</Touch>
<Message Text="Created files = @(CreatedFiles)"/>
Você pode descobrir muito facilmente usando Exec.
Para testar se ALL de um conjunto de arquivos existe:. O comando DOS FOR / D aceita uma lista separada por ponto e vírgula de arquivos - ou seja, um achatada variedade item
<!-- All exist -->
<Exec
Command="for /D %%i in (@(MyFiles)) do if not exist %%i exit 1"
IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="ExistExitCode"/>
</Exec>
Para testar se qualquer um de um conjunto de arquivos existe: O comando DOS DIR aceita uma lista separada por ponto e vírgula de arquivos. Ele define o% ERRORLEVEL% para 0 se encontra todos os arquivos na lista, diferente de zero se ele não o encontra. (Este é o caso mais simples, mas ele faz não endereço a pergunta original ...)
<!-- Any exists -->
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="DirExitCode"/>
</Exec>
Em seguida, muito provavelmente você vai querer definir uma propriedade booleana com base na saída.
Editar : BTW este é um cheiro de código. Normalmente, quando você encontrar-se querer fazer isso, é uma indicação de que você deve definir a propriedade Saídas do alvo assim que fará um loop sobre os itens.