我正在设置发布到相对路径以进行本地测试(尤其是 xml 配置转换)。每个开发人员都有自己的签出项目路径,我想设置一个与机器/环境无关的发布。
发布对话框不提示其中允许的任何变量或通配符,它不接受obj\publish
或file://./obj/publish
有没有办法发布到相对文件系统路径?
我正在设置发布到相对路径以进行本地测试(尤其是 xml 配置转换)。每个开发人员都有自己的签出项目路径,我想设置一个与机器/环境无关的发布。
发布对话框不提示其中允许的任何变量或通配符,它不接受obj\publish
或file://./obj/publish
有没有办法发布到相对文件系统路径?
对于使用 Visual Studio 2012 和新发布配置文件 ( Properties/PublishProfiles/Local.pubxml
) 的用户,您可以在文件本身中使用以下语法:
<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>
请注意,$(MSBuildThisFileDirectory) 属性将解析为 Local.pubxml 目录。从那里你应该遍历到你需要去的地方。
对于 Visual Studio 2012,此解决方案将不起作用。您应该在此之后查看 michielvoo 的答案。
经过反复尝试,我找到了解决方案:您可以通过设置使用相对路径
file:///./obj/publish
在Publish WebApp
对话框中,但您必须使用您正在使用的用户已经存在且可写的路径。这样,您可以在本地文件夹或与路径相关的文件夹中发布您的 Web 应用程序。
让我知道这是否有帮助。它对我有用。
在 Visual Studio 2012 中,只需一条带有正斜杠的常规路径即可:
../../../../../app
这从已发布项目的根目录开始。
这在 Visual Studio 2013 中对我有用:
file:\\..\..\..\Publish
请注意,这不会像原始发布者想要的那样发布到 obj\publish,而是根据我的需要发布到我系统上的另一个目录(几个文件夹)。如果您愿意,可以为 obj\publish 修改它。
VS 2015 接受类似的东西
..\..\..\DeployFiles
如果文件夹丢失,它也会创建该文件夹,以便您的发布设置可以进入源代码控制,但您可以轻松忽略 DeployFiles 文件夹及其内容。
对于额外的发布后步骤需要使用相对路径调用 msdeploy (MSVS 2015, dnx) 的情况,另一种选择是编辑项目文件(不是 pubxml,尽管这也可能有效)并创建一个变量,该变量是将相对路径转化为绝对路径。
<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>
然后$(AbsOutDir)
可以根据需要在其他地方使用(例如用于 msdeploy contentPath)。我认为它不能在对话框中输入。
来自“ how-can-i-get-msbuild-to-evaluate-and-print-the-full-path-when-given-a-relative ”。