WebApplication publish to relative filesystem path
Asked Answered
E

6

54

I'm setting up a publish to a relative path for testing locally (especially xml config transformations). Each developer has their own path to the checked out project and I'd like to set up a publish that is machine/environment agnostic.

The publish dialog doesn't hint at any variables or wildcards that are allowed in it and it doesn't accept obj\publish or file://./obj/publish

Is there a way to publish to a relative filesystem path?

Elohist answered 5/7, 2011 at 18:35 Comment(6)
I need to solve this problem too. Starting a bounty for it!Butacaine
Um why do you need to publish for development in the first place? And if this is for deployment most people use a build script in nant, msbuild, etc.Accretion
@Accretion - to test the deploy functionality locallyElohist
I would still use nant, msbuild or rake and add a deployment target to the build scriptAccretion
@Accretion - also you can publish to a local folder and then collect the files into an installer package. This is kind of necessary when working with some installer products.Sutra
VS 2015 accepts something like ..\..\..\DeployFiles. The folder will be created if it does not already existBanky
B
18

Edit

For Visual Studio 2012, this solution will not work. You should look at the answer by michielvoo just after this one.

Original answer

After trying and trying I found the solution: you can use a relative path by setting

file:///./obj/publish

in the Publish WebApp dialog, but you must use a path that is already existent and writable by the user you are using. This way you can publish your web app in a local folder, or a path related folder.

Let me know if this helps. It did for me.

Butacaine answered 11/7, 2011 at 14:33 Comment(7)
I had to create the obj/publish folder but once I did it worksElohist
So then to make this solid would you add a prebuild task to check for and create the obj/publish folder?Taxidermy
Seems working quite well, but it's seems not working if the path have spaces (and quotes doesn't seems to help) (issue while doing file:///../../Web )Fons
Where is the obj/publish folder relative to the web project on the filesystem?Sutra
This solution didn't work for me with VS 2012. The 'file://$(MSBuildProjectDirectory)/../../obj/publish' below did.Jennijennica
The most recent solution for the most recent problem always wins :)Butacaine
In VS2012 I just used: obj/publishTubular
T
50

For those using Visual Studio 2012 and the new publish configuration file (Properties/PublishProfiles/Local.pubxml) you can use this syntax in the file itself:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <SiteUrlToLaunchAfterPublish />
    <publishUrl>$(MSBuildThisFileDirectory)..\..\obj\publish</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

Be aware that the $(MSBuildThisFileDirectory) property will resolve to the Local.pubxml directory. From there you should traverse up to get where you need to be.

Tortfeasor answered 7/11, 2012 at 10:23 Comment(6)
As of the latest build, if you are doing this from the command line, you'll need to flip that around like this: <publishUrl>$(MSBuildProjectDirectory)\..\..\obj\publish</publishUrl>. That'll work in both VS2012 and from MSBuild.Thimbleful
The issue for VS2012 was fixed in VS Update 2 (see also comments on this answer)Soares
Is the issue for VS2012 that got fixed the fact that it resolved to the publish profile directory instead of the actual project directory? Because you no longer need to jump up with ..\..Monda
According to https://mcmap.net/q/340036/-web-deploy-using-relative-paths-for-local-file-system-deployment we should use $(MSBuildThisFileDirectory), this will always resolve to the PublishProfile folderMauromaurois
You have one too many \ in there. No backslash after MSBuildThisFileDirectory.. e.g. <publishUrl>$(MSBuildThisFileDirectory)..\..\obj\publish</publishUrl>Caliber
Unfortunately, this works in a "one shot" way, because Visual Studio replaces the relative path based on this variable by an absolute path. I was intending to use this so that multple developpers with different file system structures could always publish to the same directory relatively to the project itself, but this won't do the trick.Christychristye
B
18

Edit

For Visual Studio 2012, this solution will not work. You should look at the answer by michielvoo just after this one.

Original answer

After trying and trying I found the solution: you can use a relative path by setting

file:///./obj/publish

in the Publish WebApp dialog, but you must use a path that is already existent and writable by the user you are using. This way you can publish your web app in a local folder, or a path related folder.

Let me know if this helps. It did for me.

Butacaine answered 11/7, 2011 at 14:33 Comment(7)
I had to create the obj/publish folder but once I did it worksElohist
So then to make this solid would you add a prebuild task to check for and create the obj/publish folder?Taxidermy
Seems working quite well, but it's seems not working if the path have spaces (and quotes doesn't seems to help) (issue while doing file:///../../Web )Fons
Where is the obj/publish folder relative to the web project on the filesystem?Sutra
This solution didn't work for me with VS 2012. The 'file://$(MSBuildProjectDirectory)/../../obj/publish' below did.Jennijennica
The most recent solution for the most recent problem always wins :)Butacaine
In VS2012 I just used: obj/publishTubular
T
8

Just a regular path with forward slashes works in Visual Studio 2012:

../../../../../app

This starts at the published project's root directory.

Translative answered 27/10, 2014 at 22:17 Comment(0)
C
5

This worked for me in Visual Studio 2013:

file:\\..\..\..\Publish

Please note that this doesn't publish to obj\publish, as the original poster wanted, but to another directory (a few folders up) on my system as I desired. Modify it for obj\publish if you wish.

Chinfest answered 13/2, 2014 at 0:31 Comment(2)
No need for \\ in my VS2013. This path file:..\..\..\Publish is correct for me.Acrobatic
Worked for me in VS 2015Bloodhound
B
5

VS 2015 accepts something like

..\..\..\DeployFiles

It will also create the folder if it is missing so your publish settings can go into source control but you can easily ignore the DeployFiles folder and its contents.

Banky answered 27/7, 2016 at 19:11 Comment(0)
A
0

For the case where an additional post publish step needs to call msdeploy (MSVS 2015, dnx) with a relative path, another alternative is to edit project file (not the pubxml although that may work too) and create a variable that is the conversion of the relative path into an absolute path.

<Target Name="AfterWebPublish" AfterTargets="WebPublish">
     <!-- 
          msdeploy cannot currently handle relative paths for contentPath so first convert it to an absolute path 
     -->    
    <PropertyGroup>
        <AbsOutDir>$([System.IO.Path]::GetFullPath("$(ProjectDir)$(OutDir)"))</AbsOutDir>
    </PropertyGroup>

    <Exec WorkingDirectory="$(ProjectDir)" Command='call "$(DevEnvDir)..\Tools\vsvars32.bat"' />    
    <Exec WorkingDirectory="$(ProjectDir)" Command='"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy" -verb:sync -source:contentPath="$(AbsOutDir)PublishOutput" -dest:package="$(AbsOutDir)$(MSBuildProjectName).zip"' />
  </Target>

Then $(AbsOutDir) can be used elsewhere as needed (such as for msdeploy contentPath). I don't think it can be entered within the dialog.

From "how-can-i-get-msbuild-to-evaluate-and-print-the-full-path-when-given-a-relative".

Archivist answered 30/3, 2016 at 1:4 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.