#msbuild #itemgroup #createitem
#msbuild #itemgroup #createitem
Вопрос:
Короткая история: у меня есть список с атрибутом, называемым true. Я хочу скопировать все эти файлы в список папок, скажем, определенный …
someFolder
С этой целью вот что я делаю сегодня:
<CreateItem Include="%(Reference.HintPath)"
Condition="'%(Reference.Binplace)' == 'true'"
AdditionalMetadata="DestinationFolder=$(DestinationForReferences)%(Reference.BinplaceFolder)">
<Output ItemName="Binplace" TaskParameter="Include" />
</CreateItem>
У меня уже есть целевой объект с именем Binplace, который внутренне вызывает Copy. Проблема в том, что это один элемент, и я не знаю, как я могу вызвать Copy для нескольких из этих элементов
И в моем файле CSPROJ я делаю это:
<Reference Include="MyCompany.Something.Something">
<HintPath>$(LocalLibraryFolder)MyCompany.Something.Something.dll</HintPath>
<Binplace>true</Binplace>
</Reference>
Комментарии:
1. Извините, прочитал это три раза, и я понятия не имею, чего вы пытаетесь достичь, или в чем проблема, не могли бы вы добавить кучу дополнительных деталей к вашему вопросу?
2. Добавлена дополнительная информация, помогает ли это?
3. В вашем тексте упоминается папка с именем «someFolder», но я не вижу ссылки на нее в msbuild. Вам нужно показать свой целевой объект «Binplace». Как целевой объект «Binplace» связан с .csproj, находится ли он в импортированном файле targets или в отдельном проекте MSBuild?
Ответ №1:
<ItemGroup>
<Reference Include="1">
<HintPath>$(LocalLibraryFolder)1.dll</HintPath>
<Binplace>true</Binplace>
<BinplaceFolder>SubFolder1SubFolder12</BinplaceFolder>
</Reference>
<Reference Include="2">
<HintPath>$(LocalLibraryFolder)2.dll</HintPath>
<Binplace>true</Binplace>
<BinplaceFolder>SubFolder2SubFolder22</BinplaceFolder>
</Reference>
</ItemGroup>
<PropertyGroup>
<LocalLibraryFolder>.</LocalLibraryFolder>
<DestinationForReferences>.</DestinationForReferences>
</PropertyGroup>
<Target Name="CopyReferencedBinaries"
Outputs="%(Reference.Identity)">
<ItemGroup>
<SourceBinaryFullPath Include="%(Reference.HintPath)" />
</ItemGroup>
<PropertyGroup>
<SourceBinaryDir>$(DestinationForReferences)%(Reference.BinplaceFolder)</SourceBinaryDir>
</PropertyGroup>
<MakeDir Directories="$(SourceBinaryDir)"
Condition="!Exists('$(SourceBinaryDir)')"/>
<Copy SourceFiles="@(SourceBinaryFullPath)"
DestinationFiles="@(SourceBinaryFullPath->'$(SourceBinaryDir)%(Filename)%(Extension)')" />
</Target>
Комментарии:
1. возможно, у вас получилось наоборот. Мне нужно, чтобы в моей propertygroup был список местоположений для развертывания. поэтому <propertygroup><список> папка 1</list><список> папка 2</list></propertygroup>
2. А Binplacefolder просто означает удаление этого конкретного поля в другом месте, но если это поле отсутствует, поместите его во все местоположения, указанные propertygroup
3. @gaganuprasad Я думаю, вы не понимаете, как работает конструкция PropertyGroup. Это позволяет вам создавать только отдельные переменные, а не коллекции. Тег PropertyGroup просто позволяет вам группировать эти свойства в одном и том же расположении в xml и не делает их связанными каким-либо другим способом.