Visual Studio 2010 tiene un comando Publicar que le permite publicar su Proyecto de aplicación web en una ubicación del sistema de archivos. Me gustaría hacer esto en mi servidor de compilación TeamCity, así que necesito hacerlo con el corredor de soluciones o msbuild. Intenté usar el objetivo Publicar, pero creo que podría ser para ClickOnce:
msbuild Project.csproj /t:Publish /p:Configuration=Deploy
Básicamente quiero hacer exactamente lo que hace un proyecto de implementación web, pero sin el complemento. Lo necesito para compilar el WAP, eliminar cualquier archivo innecesario para la ejecución, realizar cualquier transformación web.config y copiar el resultado en una ubicación específica.
Mi solución , basada en la respuesta 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>
Respuestas:
Lo tengo principalmente trabajando sin un script personalizado de msbuild. Estas son las configuraciones de configuración relevantes de TeamCity:
Esto compilará, empaquetará (con la transformación web.config) y guardará la salida como artefactos. Lo único que falta es copiar el resultado en una ubicación específica, pero eso podría hacerse en otra configuración de compilación de TeamCity con una dependencia de artefactos o con un script msbuild.
Actualizar
Aquí hay un script de msbuild que compilará, empaquetará (con la transformación web.config) y copiará la salida a mi servidor provisional
También puede eliminar las propiedades SolutionName y ProjectName de la etiqueta PropertyGroup y pasarlas a msbuild.
Actualización 2
Dado que esta pregunta todavía recibe una gran cantidad de tráfico, pensé que valía la pena actualizar mi respuesta con mi script actual que usa Web Deploy (también conocido como MSDeploy).
En TeamCity, tengo parámetros con nombre
env.Configuration
,env.ProjectName
yenv.DeployServiceUrl
. El corredor MSBuild tiene la ruta del archivo de compilación y los parámetros se pasan automáticamente (no es necesario que los especifique en los parámetros de la línea de comandos).También puede ejecutarlo desde la línea de comando:
fuente
Package
Probé el ejemplo de su primera actualización y parece que el objetivo también depende de 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.
(Mencionándolo ya que escribe que su segunda actualización usa WebDeploy, lo que podría implicar que la primera aún no usaría WebDeploy).Con los perfiles de implementación introducidos en VS 2012, puede publicar con la siguiente línea de comando:
Para obtener más información sobre los parámetros, consulte esto .
Los valores para el
/p:VisualStudioVersion
parámetro dependen de su versión de Visual Studio. Wikipedia tiene una tabla de lanzamientos de Visual Studio y sus versiones .fuente
/p:VisualStudioVersion=?
para 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
...... Pero aún obteniendo solo archivos DLL, no todos los archivos como en la carpeta de publicación: (`/p:VisualStudioVersion=15
. No estoy seguro de si esto está relacionado con su problema de copia de archivos.Se me ocurrió tal solución, funciona muy bien para mí:
La salsa secreta es _WPPCopyWebApplication target.
fuente
error MSB4057: The target "_WPPCopyWebApplication" does not exist in the project
. Sacar esa parte condujo a un despliegue sin desplegar ninguna vistaMSBuild.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
. Me da un errorMSBUILD : error MSB1008: Only one project can be specified. Switch: WebSite/New
. ¿Existe alguna solucion para esto?No conozco TeamCity, así que espero que esto funcione para ti.
La mejor forma en que he encontrado para hacer esto es con MSDeploy.exe. Esto es parte del proyecto WebDeploy ejecutado por Microsoft. Puedes descargar los bits aquí .
Con WebDeploy, ejecuta la línea de comando
Esto hace lo mismo que el comando VS Publish, copiando solo los bits necesarios en la carpeta de implementación.
fuente
Con VisualStudio 2012 hay una manera de manejar subj sin publicar perfiles. Puede pasar la carpeta de salida utilizando los parámetros. Funciona tanto con la ruta absoluta como con la relativa en el parámetro 'editUrl'. Puede usar VS100COMNTOOLS, sin embargo, debe anular VisualStudioVersion para usar el 'WebPublish' de destino
%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets
. Con VisualStudioVersion 10.0, este script tendrá éxito sin resultados :)Actualización: logré usar este método en un servidor de compilación con solo Windows SDK 7.1 instalado (no Visual Studio 2010 y 2012 en una máquina). Pero tuve que seguir estos pasos para que funcione:
Guión:
fuente
Encontré dos soluciones diferentes que funcionaron de manera ligeramente diferente:
1. Esta solución está inspirada en la respuesta de alexanderb [enlace] . Desafortunadamente no funcionó para nosotros, algunos dll no fueron copiados al OutDir. Nos dimos cuenta de que la sustitución
La desventaja de esta solución fue el hecho de que OutDir contenía no solo archivos para publicación.ResolveReferences
conBuild
destino resuelve el problema - ahora todos los archivos necesarios se copian en la ubicación OutDir.2. La primera solución funciona bien pero no como esperábamos. Queríamos tener la funcionalidad de publicación tal como está en Visual Studio IDE, es decir, solo los archivos que deberían publicarse se copiarán en el directorio de Salida. Como ya se mencionó, la primera solución copia muchos más archivos en OutDir: el sitio web para la publicación se almacena en una
_PublishedWebsites/{ProjectName}
subcarpeta. El siguiente comando resuelve esto: solo los archivos para publicación se copiarán en la carpeta deseada. Así que ahora tiene un directorio que puede publicarse directamente; en comparación con la primera solución, ahorrará espacio en el disco duro.AutoParameterizationWebConfigConnectionStrings=false
El parámetro garantizará que las cadenas de conexión no se manejarán como artefactos especiales y se generarán correctamente; para obtener más información, consulte el enlace .fuente
Debes configurar tus entornos
y haga referencia a mi blog (lo siento, la publicación fue coreana)
http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7
fuente
Este es mi archivo por lotes
fuente
este es mi lote de trabajo
edit-my-website.bat
Tenga en cuenta que instalé Visual Studio en el servidor para poder ejecutarlo
MsBuild.exe
porque lasMsBuild.exe
carpetas en .Net Framework no funcionan.fuente
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
...... Pero todavía obtengo solo archivos DLL, no la estructura de archivos que quiero. ¿Qué tiene de malo? :(Puede publicar la solución con la ruta deseada por el siguiente código, aquí PublishInDFolder es el nombre que tiene la ruta donde necesitamos publicar (necesitamos crear esto en la siguiente imagen)
Puede crear un archivo de publicación como este
Agregue debajo de 2 líneas de código en el archivo por lotes (.bat)
fuente
Para generar la salida de publicación, proporcione un parámetro más. msbuild example.sln / p: publishingprofile = nombre del perfil / p: deployonbuild = true / p: configuration = debug / or any
fuente