Eu vi isso em um arquivo de projeto outro dia:
<ProjectReference Include="Foo\Bar\Baz.csproj">
<Project>{A GUID HERE}</Project>
<Name>Baz</Name>
<Private>False</Private> <!-- ??? -->
<ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>
Cada nó em um ProjectReference
parece ser autoexplicativo (o arquivo de projeto referenciado, GUID, nome a ser mostrado no gerenciador de soluções e se o projeto atual deve ser vinculado ou não ao projeto referenciado) Private
, exceto , e a página Itens do projeto MSBuild comuns não t documente esse valor. (Há um Private
cenário documentado para Reference
, em vez de ProjectReference
- mas tem Never
, Always
, e PreserveNewest
configurações, não verdadeiros e falsos)
O que essa configuração faz?
visual-studio
msbuild
Billy ONeal
fonte
fonte
ProjectReference
item é reconhecido (pelo menos) pela infraestrutura de suporte C # e C ++ MSBuild; parece que ele é tratado principalmente noMicrosoft.Common.CurrentVersion.targets
arquivo.Respostas:
A
Private
marca mantém a substituição do usuário na caixa de seleção "Copiar local" na pasta Referências do Visual Studio. Isso controla se a referência é usada do GAC ou se ele irá copiar o assembly referenciado para o diretório de compilação.Embora eu não consiga encontrar nenhuma documentação do MSDN para esse efeito (quelle surpresa), é evidente pelo comportamento e pelo comentário emMicrosoft.Common.CurrentVersion.targets:1742
que é aplicado:Isso está documentado em MSDN> Itens de projeto comuns do MSBuild e é evidente a partir do comportamento e do comentário em
Microsoft.Common.CurrentVersion.targets:1742
que é aplicado:fonte
<Private>
estiver faltando, não é equivalente aTrue
. Procure por "Bug do MSBuild CopyLocal". Por exemplo, consulte stackoverflow.com/questions/1132243msbuild\Reference.cs:949
<Private>
estiver definido comoTrue
, o MSBuild ainda não inclua a referência na saída se não for usado pelo aplicativo? Este é o comportamento atual que estou obtendo localmente ...Eu quero apenas afirmar, que
<Private>false</Private>
(que você pode aplicar aProjectReference
s) pode não funcionar ao usar<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />
e o projeto$(MSBuildProjectFullPath)
temProjectReference
s que têm<None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None>
. Eu li o código-fonte em https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets e encontrei a solução. Você precisa definir_GetChildProjectCopyToPublishDirectoryItems=false
para que um exemplo seja:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />
fonte