O Visual Studio 2010 possui um comando Publicar que permite publicar seu Projeto de Aplicativo da Web em um local do sistema de arquivos. Gostaria de fazer isso no meu servidor de compilação TeamCity, por isso preciso fazê-lo com o gerenciador de soluções ou o msbuild. Tentei usar o destino de publicação, mas acho que pode ser para o ClickOnce:
msbuild Project.csproj /t:Publish /p:Configuration=Deploy
Basicamente, quero fazer exatamente o que um projeto de implantação da web faz, mas sem o suplemento. Preciso compilar o WAP, remover todos os arquivos desnecessários para execução, executar qualquer transformação web.config e copiar a saída para um local especificado.
Minha solução , com base na resposta de Jeff Siver
<Target Name="Deploy">
<MSBuild Projects="$(SolutionFile)"
Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package"
ContinueOnError="false" />
<Exec Command=""$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd" /y /m:$(DeployServer) -enableRule:DoNotDeleteRule"
ContinueOnError="false" />
</Target>
Respostas:
Eu consegui trabalhar principalmente sem um script msbuild personalizado. Aqui estão as definições de configuração relevantes do TeamCity:
Isso irá compilar, empacotar (com a transformação web.config) e salvar a saída como artefatos. A única coisa que falta é copiar a saída para um local especificado, mas isso pode ser feito em outra configuração de compilação do TeamCity com uma dependência de artefato ou com um script msbuild.
Atualizar
Aqui está um script msbuild que irá compilar, empacotar (com a transformação web.config) e copiar a saída no meu servidor intermediário
Você também pode remover as propriedades SolutionName e ProjectName da marca PropertyGroup e passá-las para o msbuild.
Atualização 2
Como essa pergunta ainda recebe bastante tráfego, achei que valia a pena atualizar minha resposta com meu script atual que usa o Web Deploy (também conhecido como MSDeploy).
No TeamCity, tenho parâmetros nomeados
env.Configuration
,env.ProjectName
eenv.DeployServiceUrl
. O MSBuild runner possui o caminho do arquivo de compilação e os parâmetros são transmitidos automaticamente (você não precisa especificá-los nos parâmetros de linha de comando).Você também pode executá-lo na linha de comando:
fonte
Package
destino também depende do WebDeploy:error : Package/Publish task Microsoft.Web.Publishing.Tasks.IsCleanMSDeployPackageNeeded failed to load Web Deploy assemblies. Microsoft Web Deploy is not correctly installed on this machine.
(mencionando que você escreve que sua segunda atualização usa o WebDeploy, o que pode implicar que a primeira ainda não usaria o WebDeploy.)Usando os perfis de implantação introduzidos no VS 2012, você pode publicar com a seguinte linha de comando:
Para mais informações sobre os parâmetros, consulte isso .
Os valores para o
/p:VisualStudioVersion
parâmetro dependem da sua versão do Visual Studio. A Wikipedia possui uma tabela de lançamentos do Visual Studio e suas versões .fonte
/p:VisualStudioVersion=?
para o VS 2017?msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1
...... Mas ainda obtendo apenas DLLs, nem todos os arquivos como na pasta de publicação: (`/p:VisualStudioVersion=15
. Não tenho certeza se isso está relacionado ao seu problema de cópia de arquivo.Eu vim com essa solução, funciona muito bem para mim:
O molho secreto é o destino _WPPCopyWebApplication.
fonte
error MSB4057: The target "_WPPCopyWebApplication" does not exist in the project
. Tirando essa parte levou a uma implantação sem implantar qualquer opiniãoMSBuild.exe C:\BuildAgent\work\4c7b8ac8bc7d723e\WebService.sln /p:Configuration=Release /p:OutputPath=bin /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MsDeployServiceUrl=https://204.158.674.5/msdeploy.axd /p:username=Admin /p:password=Password#321 /p:AllowUntrustedCertificate=True /p:DeployIisAppPath=Default WebSite/New /p:MSDeployPublishMethod=WMSVC
. Isso me dá um erroMSBUILD : error MSB1008: Only one project can be specified. Switch: WebSite/New
. Existe uma solução para isso?Como não conheço o TeamCity, espero que isso funcione para você.
A melhor maneira que encontrei para fazer isso é com o MSDeploy.exe. Isso faz parte do projeto WebDeploy, executado pela Microsoft. Você pode baixar os bits aqui .
Com o WebDeploy, você executa a linha de comando
Isso faz o mesmo que o comando VS Publish, copiando apenas os bits necessários para a pasta de implantação.
fonte
Com o VisualStudio 2012, há uma maneira de lidar com o assunto sem publicar perfis. Você pode passar a pasta de saída usando parâmetros. Ele funciona com caminho absoluto e relativo no parâmetro 'publishUrl'. Você pode usar o VS100COMNTOOLS, mas precisa substituir o VisualStudioVersion para usar o destino 'WebPublish'
%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets
. Com o VisualStudioVersion 10.0, este script será bem-sucedido sem saídas :)Atualização: consegui usar esse método em um servidor de compilação com apenas o Windows SDK 7.1 instalado (sem o Visual Studio 2010 e 2012 em uma máquina). Mas eu tive que seguir estas etapas para fazê-lo funcionar:
Roteiro:
fonte
encontrou duas soluções diferentes que funcionavam de maneira ligeiramente diferente:
1. Esta solução é inspirada na resposta de alexanderb [link] . Infelizmente, não funcionou para nós - algumas dlls não foram copiadas para o OutDir. Descobrimos que a substituição
A desvantagem dessa solução foi o fato de o OutDir conter não apenas arquivos para publicação.ResolveReferences
peloBuild
destino resolve o problema - agora todos os arquivos necessários são copiados no local do OutDir.2. A primeira solução funciona bem, mas não como esperávamos. Queríamos ter a funcionalidade de publicação como está no Visual Studio IDE - ou seja, apenas os arquivos que devem ser publicados serão copiados no diretório Saída. Como já foi mencionado, a primeira solução copia muito mais arquivos no OutDir - o site para publicação é armazenado em
_PublishedWebsites/{ProjectName}
subpasta. O comando a seguir resolve isso - apenas os arquivos para publicação serão copiados para a pasta desejada. Então agora você tem um diretório que pode ser publicado diretamente - em comparação com a primeira solução, você economizará espaço no disco rígido.AutoParameterizationWebConfigConnectionStrings=false
O parâmetro garantirá que as cadeias de conexão não sejam tratadas como artefatos especiais e serão geradas corretamente - para obter mais informações, consulte o link .fonte
Você deve definir seus ambientes
e referência meu blog. (desculpe post foi coreano)
http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7
fonte
Este meu arquivo em lote
fonte
este é o meu lote de trabalho
publique meu site.bat
Observe que eu instalei o Visual Studio no servidor para poder executar
MsBuild.exe
porque asMsBuild.exe
pastas .Net Framework não funcionam.fonte
msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1
...... Mas ainda estou recebendo apenas DLLs e não a estrutura de arquivos que eu quero. O que há de errado com isso? :(Você pode publicar a solução com o caminho desejado pelo código abaixo. Aqui PublishInDFolder é o nome que possui o caminho em que precisamos publicar (precisamos criar isso na foto abaixo)
Você pode criar um arquivo de publicação como este
Adicione abaixo de 2 linhas de código no arquivo em lotes (.bat)
fonte
Para gerar a saída de publicação, forneça mais um parâmetro. msbuild example.sln / p: publishprofile = nome do perfil / p: deployonbuild = true / p: configuration = debug / ou qualquer
fonte