Estou tentando escrever um sistema de plug-in com o .NET Core e um dos meus requisitos é poder distribuir a DLL do plug-in junto com suas dependências para o usuário instalar.
No entanto, não consigo descobrir como incluir minhas dependências do NuGet como um artefato de construção e gerá-las na pasta de construção, sem precisar usar dotnet publish
como um hack. Existe alguma maneira de especificar isso no arquivo .csproj (arquivo de projeto)?
dotnet publish
seria um hack? Inclua o comando em seu arquivo csproj como um script de pós-compilação.dotnet publish
joga todo o framework na pasta de publicação, já que estou escrevendo um plugin, a maioria dos arquivos não são necessários, pois o framework já estaria carregado pelo programa bootstrapper. Estou procurando algo semelhante a como as compilações funcionam no .NET Framework.<CopyToOutputDirectory>Always</CopyToOutputDirectory>
em seu csproj em cada uma das dlls que você deseja mover não resolve? Talvez combinado com um<link>
nó?<PackageReference/>
não suporta<CopyToOutputDirectory>
.Respostas:
Você pode adicionar isso a um
<PropertyGroup>
arquivo csproj dentro de seu arquivo para forçar a cópia de assemblies NuGet para a saída da compilação:No entanto, observe que a saída de construção (
bin/Release/netcoreapp*/*
) não deve ser portátil e distribuível, a saída dedotnet publish
é. Mas, no seu caso, copiar os assemblies para a saída do build é provavelmente muito útil para fins de teste. Mas observe que você também pode usar aDependencyContext
api para resolver as DLLs e seus locais que fazem parte do gráfico de dependência do aplicativo em vez de enumerar um diretório local.fonte
DependencyContext
? Como posso usá-lo para localizar uma DLL que não está no diretório do aplicativo? Onde está, afinal?Você pode usar PostBuildEvent para automatizar a implantação do módulo na construção.
Para obter assemblies NuGet na pasta de compilação, adicione csproj do seu módulo
Defina quais arquivos de módulo você deseja onde usando Incluir / Excluir (modifique o caminho conforme necessário)
Redefina sua pasta de construção para o padrão e adicione PostbuildEvent
Estou incluindo app_offline para reciclar o aplicativo se ele já estiver em execução para evitar erros de arquivo em uso.
fonte
Adicionando
não funcionou, mas adicionar isso ao arquivo .csproj do Framework:
fez.
fonte
Eu "resolvi" (criei uma solução alternativa) de maneira mais simples.
Na pós-construção
pub
é a pasta onde você deseja que seu material publicado vá para testeNOTA: dependendo de qual versão
dotnet.exe
você usa, o comando--no-build
pode não estar disponível.Por exemplo, não disponível na v2.0.3; e disponível em v2.1.402. Eu sei que o VS2017 Update4 tinha v2.0.3. E Update8 tem 2.1.x
Atualizar:
A configuração acima funcionará no ambiente de depuração básico, mas para colocá-la no ambiente de servidor / produção de compilação é necessário mais. Neste exemplo particular que tive que resolver, construímos
Release|x64
eRelease|x86
separadamente. Então, eu expliquei ambos. Mas para suportar odotnet publish
comando post build , eu primeiro adicioneiRuntimeIdentifier
ao arquivo de projeto.Por que eu precisava e por que você pode escapar sem ele? Eu precisava disso porque meu programa de compilação está definido para interceptar o aviso MSB3270 e falhar na compilação se ele aparecer. Este aviso diz, "ei, alguns arquivos em suas dependências estão no formato errado". Mas você se lembra do objetivo deste exercício? Precisamos extrair DLLs de dependência de pacote. E, em muitos casos, não importa se esse aviso está lá, porque a pós-compilação não importa. Novamente, este é o meu programa de construção que se preocupa. Portanto, adicionei apenas
RuntimeIdentifier
2 configurações que utilizo durante a construção de produção.Postagem completa
Explicação: o dotnet publish está procurando
obj\Debug
ouobj\Release
. Não o temos durante a construção porque a construção criaobj\x64\Release
ouobj\x86\Release
. As linhas 1 e 2 atenuam esse problema. Na linha 3, digodotnet.exe
para usar configuração específica e tempo de execução de destino. Caso contrário, quando este é o modo de depuração, não me importo com as coisas do tempo de execução e avisos. E na última linha, simplesmente pego minhas dlls e as copio para a pasta de saída. Tarefa concluída.fonte
dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub
xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
Em conjunto com a resposta acima: Isso está funcionando muito bem na linha de comando do evento Pós-compilação: no Visual Studio. Ele executa um loop em uma seleção de dlls (System * .dll e Microsoft .dll) * e, em seguida, ignora a exclusão de dlls específicas. System.Data.SqlClient.dll e System.Runtime.Loader.dll
fonte