У меня есть ситуация, когда мне нужно скопировать несколько определенных файлов в MSBuild script, но они могут или не могут существовать. Если они не существуют, это хорошо, я не нуждаюсь в них тогда. Но стандартная задача <copy>
вызывает ошибку, если она не может найти каждый элемент в списке...
MSBuild - как копировать файлы, которые могут или не могут существовать?
Ответ 1
Используйте условие Существует для задачи копирования.
<CreateItem Include="*.xml">
<Output ItemName="ItemsThatNeedToBeCopied" TaskParameter="Include"/>
</CreateItem>
<Copy SourceFiles="@(ItemsThatNeedToBeCopied)"
DestinationFolder="$(OutputDir)"
Condition="Exists('%(RootDir)%(Directory)%(Filename)%(Extension)')"/>
Ответ 2
Самый простой способ - использовать флаг ContinueOnError http://msdn.microsoft.com/en-us/library/7z253716.aspx
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<MySourceFiles Include="a.cs;b.cs;c.cs"/>
</ItemGroup>
<Target Name="CopyFiles">
<Copy
SourceFiles="@(MySourceFiles)"
DestinationFolder="c:\MyProject\Destination"
ContinueOnError="true"
/>
</Target>
</Project>
Но если что-то еще не так, вы этого не заметите. Таким образом, условие существует от ответа madgnome, было бы лучше.
Ответ 3
Похоже, вы можете отметить MySourceFiles как SkipUnchangedFiles = "true", и он не будет копировать файлы, если они уже существуют.