I have a following set of files/folders that I need to deploy to my web site
+---App_Browsers
+---bin
+---Config
+---Development
+---static
+---xsl
web.config
404.html
500.html
I would like to sync the files/folder with the one of the server and I don't want to erase any other file, folder on the server.
Ideally I would use
msdeploy -verb:sync,
because I want the folder that I'm deploying to be synchronized, but I want to preserve the existing folders on the site. -skip is not an option too, because the existing folders are dynamic, we have CMS system that might be changing files/folders on the fly.
This is not a complete answer, but try -enableRule:DoNotDeleteRule:
msdeploy -verb:sync -source:package=package.zip -dest:auto -enableRule:DoNotDeleteRule
Related
I have MSDeploy successfully deploying a web package zip file to a remote IIS website using a command like this
MyDeployCommand.deploy.cmd /T /M:https://MyServer:8172/msdeploy.axd -allowUntrusted /U:Username /P:Password /A:Basic "-setParam:name='IIS Web Application Name',value='My Website Name'"
Although this works, it defaults to the current directory that the website is pointing to. I'd like to change the physical path. I've tried a number of parameters with no success and was wondering if this is even possible to do.
Thanks to chief7 for pointing out the appcmd, which on the target works eg
%windir%\system32\inetsrv\appcmd set site /site.name:"My Website Name" /application[path='/'].virtualDirectory[path='/'].physicalPath:"C:\new\path"
However if I try the same thing on the remote machine eg
"%MSDeployPath%msdeploy.exe" -verb:sync -source:runCommand="%windir%\system32\inetsrv\appcmd.exe set site /site.name:;quot;My Website Name;quot; /application[path='/'].virtualDirectory[path='/'].physicalPath:;quot;C:\new\path;quot;",dontUseCommandExe=true -dest:auto
Its coming back with
Error: The system cannot find the file specified. (Exception from HRESULT: 0x80070002) which I assume is referring to the appcmd. I added
dontUseCommandExe=true
to get around the problem of it being called via cmd.exe
You can extend the WebDeploy manifest to alter the site/app path with a RunCommand provider.
<runcommand path="%windir%\system32\inetsrv\appcmd set app /app.name:"Default Web Site/app12" /[path='/'].physicalPath:C:\temp\app12" waitInterval="5000"/>
http://www.dotnetcatch.com/2016/06/28/webdeploymsdeploy-quick-tip-change-iis-siteapp-physical-path-with-msdeploy/
http://www.dotnetcatch.com/2016/05/19/extending-the-webdeploy-manifest/
The appHostConfig provider is also supposed to let you change the directory but this was easier.
I am looking to use the below asp.net 4.0 web application structure but not quite sure how to achieve my result as explained below. What configuration will be needed to handle path issues for referencing both. For example ~/css/style.css needs to dig into the WEBSITE. I know I will have to create a helper for RESOURCES -- WebResourcePath("images/image1.jpg") returns full path if that works in a separate virtual directory?
Default Web Site
>SAR-GROUPS
SARGROUPS_WEBSITE
SARGROUPS_RESOURCES
All website files like aspx, js, css, etc. normal web files go in the WEBSITE folder. The RESOURCES folder will contain other files like pdfs, xml, txt, images, and files . These files will not need to be uploaded or updated during deployments and can remain untouched. When I deploy the WEBSITE I only need to delete the WEBSITE folder and copy the new precompiled folder in SAR-GROUPS again. I have to deploy like this as it is automated deployment from scrips that run so this is an xcopy deployment.
Does anyone have good practices or a working setup to achieve this. I am not looking at alternate methods unless it cannot be done or the other way is much better for auto builds.
Thanks
If the files in the SARGROUPS_WEBSITE directory need to reference resources in the SARGROUPS_RESOURCES directory then why not just make the SARGROUPS_RESOURCES virtual directory inside the SARGROUPS_WEBSITE directory? This way you can point the SARGROUPS_RESOURCES virtual directory at a physical location on the disk and delete the contents of SARGROUPS_WEBSITE without touching the resources.
So structure would be
Default Web Site
>SAR-GROUPS
SARGROUPS_WEBSITE
SARGROUPS_RESOURCES
But the physical structure could be anything
You can then reference them like
~/SARGROUPS_RESOURCES/css/style.css
*untested
EDIT
You've totally not understood my answer and/or virtual folders.
Physical structure example:
D:\Inetpub\WEBSITE
D:\Inetpub\RESOURCES
IIS structure:
IIS Root -> Site (that is a website and points to D:\Inetpub\WEBSITE)
IIS Root -> Site > Resources (that is a virtual directory and points to D:\Inetpub\RESOURCES)
Is it possible to modify (or just replace) web.config of existing site using MSDeploy?
It's possible to replace certain sections (specified with an xPath query or regular expression) of the web config file. Use the -declareParam en -setParam commandline switches for that.
Like so
msdeploy -verb:sync -source:apphostconfig="Default Web Site" -dest:package=ParameterPackage.zip -declareParam:name=param,kind=XmlFile,scope=web.config,match=//add/#value
or so:
msdeploy -verb:sync -source:package=ParameterPackage.zip -dest:auto -setParam:name=param,value=MyDefaultWebPage.htm
You can find more info here if you're using the command line.
If your working with importing and exporting packages in and from IIS you can create a parameters.xml file. Vishal Joshi has lots of good posts about how to use msdeploy (for example this)
Yes you can do this. I just posted a blog on this at http://sedodream.com/2012/02/14/HowToUpdateASingleFileUsingWebDeployMSDeploy.aspx but I'm also copying the content below for you.
The other day I saw a question posted on StackOverflow asking if it was possible to update web.config using MSDeploy. I actually used a technique where I updated a single file in one of my previous posts at How to take your web app offline during publishing but it wasn’t called out too much. In any case I’ll show you how you can update a single file (in this case web.config) using MSDeploy.
You can use the contentPath provider to facilitate updating a single file. Using contentPath you can sync either a single file or an entire folder. You can also use IIS app paths to resolve where the file/folder resides. For example if I have a web.config file in a local folder named “C:\Data\Personal\My Repo\sayed-samples\UpdateWebConfig” and I want to update my IIS site UpdateWebCfg running in the Default Web Site on my folder I would use the command shown below.
%msdeploy% -verb:sync -source:contentPath="C:\Data\Personal\My Repo\sayed-samples\UpdateWebConfig\web.config" -dest:contentPath="Default Web Site/UpdateWebCfg/web.config"
From the command above you can see that I set the source content path to the local file and the dest content path using the IIS path {SiteName}/{AppName}/{file-path}. In this case I am updating a site running in IIS on my local machine. In order to update one that is running on a remote machine you will have to add ComputerName and possibly some other values to the –dest argument.
You can view the latest sources for this sample at my github repo.
I just completed a website that is image heavy and I'm publishing the site to an FTP server. The publish time takes ~5 minutes. Is there a way for me to configure which file types get published? I'd like to push out changes only if the file extention is: (.config, .aspx, .cs, .asmx, .js, .html, .css, .master).
Is this possible?
No, the publish process publishes the whole website.
Publish it on your local computer first and then use an FTP tool (Filezilla, CoreFTP...) to selectively upload your files to the server.
Unfortunately No, it is not possible. Publish operation is either-all-or-none operation.
Even though, I sometimes only copy the DLL assembly (from bin directory to IIS website folder) if the change is only in the code-behind files and the markup/images/other-content have no changes.
you can set the Build Action for whatever you don't want published to None
These won't get copied to the deployment directory
I have just confirmed that it works (I tested on a MVC3 site)
so you'll have to change the setting for each file you want to exclude but you can change the setting of multiple at one time and folders can't be excluded
I have an existing fairly large classic asp website, with virtual directories configured to centralize certain resources. My problem is for some reason I can't access any of my namespaces and classes. I tried adding a reference to another project where I have classes in a namespace "DAL" and even though intellisense sees the classes and the website compiles fine, it errors when I try to access any page that references a class in the "DAL" namespace.
I get the following error message in my browser "CS0103: The name 'CMS' does not exist in the current context". Part of the problem is website project's root is not the same folder/level as the web root in IIS. So my libraries are in the website root "/bin" folder, but iis is looking for these files in the IIS webroot which is at a lower level. So how can I get .net to see my binaries without putting them in the lower IIS website root directory? I tried setting up a virtual directory to my .dll file but it seems to have no effect.
thank you for your help!
======================CLARIFICATION====================
What I'm trying to do is keep the .dll files I want my website to use in a higher level directory then the folder I have set as the web root in IIS. So say the library i want to use it "DAL" it in the projects /bin folder, but under IIS the default site's Local Path is set to "/site/default". The only way I can seem to use the "DAL" library is by putting the /bin folder into "/site/default/bin", which for this project is not an option. Does this help?
Using an NTFS Junction Point to achieve what sounds like the same goal has been working for me.
By way of an example, I have a web site with 20+ child IIS Applications that are largely identical (don't ask!), rather than duplicating the 'bin' folder in each of these (they would be identical) each child application has a 'bin' junction that points to the 'bin' folder in the web site root.
/bin <- this is the actual 'bin' folder
/app1
/app1/bin <- this is a junction point
/app2
/app2/bin <- this is a junction point
/app3
/app3/bin <- this is a junction point
/images
...
...
To create these junction points, if you're using Vista/Win2k8 or later you can use the built-in command 'mklink', for earlier versions of Windows use the SysInternals junction.exe tool - available here.
Maybe make the website route folder a nested application in IIS?