MSBuild, создайте элемент в ItemGroup, чтобы привязать цель к нескольким папкам

#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 и не делает их связанными каким-либо другим способом.