使用Visual Studio打开解决方案,对<网站项目>右键点击<发布>,一切都是正常的,所有宏都可用,宏参数值也是正确的。

而通过批处理脚本命令调用MSBuild.exe对解决方案编译,一切也都是正常的,所有宏都可用,宏参数值也是正确的。

但如果你通过批处理脚本命令调用MSBuild.exe对解决方案下某个Web项目进行发布操作时,你会发现,某些针对解决方案可用的宏变得不正常,不可用,宏参数值都是错误的。

例如$(SolutionDir)在某些版本的MSBuild下它的值是"",某些版本的MSBuild下它的值是"..\"。

那么,这个有解决方法吗?答案是有的。

MSBuild有个/p命令选项,支持外部传值重置宏参数值。

在批处理命令里添加“/p:SolutionDir=path”选项,即可让$(SolutionDir)重新变为正常可用。

下面是我某个项目中提供给CI调用的发布/部署脚本文件代码:

echo Publish parameters initializing...

::These parameters are not used for the time being
::set DotNetFrameworkPath=%windir%\Microsoft.NET\Framework
::if exist %windir%\SysWOW64 set DotNetFrameworkPath=%windir%\Microsoft.NET\Framework64 :Set user level's parameters
set SolutionPath=%~dp0..\src\
set SolutionName=Demo
set SolutionFile=%SolutionPath%%SolutionName%.sln
set ProjectName=WebTestset ProjectFile=%SolutionPath%%ProjectName%\1621.%ProjectName%.csproj
set PublishProfile=WebTestDeployToRelease
set IfUseNuGetReStore=Y % value is Y or N %
set IfUpdateNuGetTool=Y % value is Y or N % :Set system level's parameters
set Configuration=Release
set LogLevel=normal
:: Note: That the MSBuild tool version and VisualStudio version and the TargetFramework version have dependencies
set VisualStudioVersion=14.0
set TargetFrameworkVersion=4.6.1
set MicrosoftSdkVersion=v10.0A set NuGetPath=%SolutionPath%.nuget\
set NuGetExe=%NuGetPath%NuGet.exe
set NuGetArgs=restore "%SolutionFile%" set AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\%MicrosoftSdkVersion%\bin\NETFX %TargetFrameworkVersion% Tools"
set MSBuildPath=C:\Program Files (x86)\MSBuild\%VisualStudioVersion%\Bin
set MSBuildExe=%MSBuildPath%\MSBuild.exe
set MSBuildArgs=/p:Configuration=%Configuration%;VisualStudioVersion=%VisualStudioVersion%;TargetFrameworkVersion=%TargetFrameworkVersion%;SolutionDir=%SolutionPath% /p:DeployOnBuild=true;PublishProfile=%PublishProfile% /p:AspnetMergePath=%AspnetMergePath% /verbosity:%LogLevel% /l:FileLogger,Microsoft.Build.Engine;encoding=utf-8;append=true;logfile=build\%ProjectName%_%Configuration%_Publish.log echo Publish parameters initialize completed. if %IfUseNuGetReStore% == Y (
if %IfUpdateNuGetTool% == Y (
echo NuGet tools Start updating...
"%NuGetExe%" update -Self
echo NuGet tools update completed.
) else (
echo Not update NuGet tools.
)
echo NuGet Start ReStoreing...
"%NuGetExe%" %NuGetArgs%
echo NuGet ReStore completed.
) else (
echo Not use NuGet tools.
) echo Start publishing...
"%MSBuildExe%" %MSBuildArgs% "%ProjectFile%"
echo Publish completed.

感谢伟大的stackoverflow论坛,给我提供了很多帮助。

答案来自于:

https://stackoverflow.com/questions/15053915/how-to-get-rid-of-solutiondir-when-building-vs-project-from-outside-visual

使用MSBuild Tools调用csproj项目文件发布网站时$(SolutionDir)宏参数值丢失为空的解决方案的更多相关文章

  1. vbscript调用WMI一键式式发布网站

    作为.net开发,在window环境下,不得不熟悉些脚本语言,来减轻些日常开发中所遇到的一些繁杂的事情,比如自动发布网站,自动发布网站等等. WMI windows管理程序接口,可用各种与语言调用,方 ...

  2. Web Deploy 发布网站错误 检查授权和委派设置

    Web Deploy发布ASP.NET网站给我们提供方便,配置好后可以很方便地发布网站到IIS服务器. 自安装Web Deploy一年以来,一直都用得好好地. 直到最近,Gitlab-CI自动发布出了 ...

  3. .NET Core New csproj 如何发布可执行文件

    一.前言 .NET工具链在最新的Preview3版本中,引入了新的MSBuild项目系统,项目文件又回归了.csproj的XML文件来管理,项目文件.包引用.程序集引用..NET Core工具集.发布 ...

  4. VS发布网站时,报错提示:“未能将文件xxx复制到xxx,未能找到文件xx”三种解决方案!

    发布网站时候大家可能会遇到这样的情况,就是报错提示说:“未能将文件xxx复制到xxx,未能找到文件xx”,这个问题一般来说有三种解决方案,个人倾向第三种,如图: 解决方案如下: 方案一.把系统提示缺失 ...

  5. 【转】.NET Core基于. csproj 配置文件发布项目

    一.前言 .NET工具链在最新的Preview3版本中,引入了新的MSBuild项目系统,项目文件又回归了.csproj的XML文件来管理,项目文件.包引用.程序集引用..NET Core工具集.发布 ...

  6. 发布网站时报错:未能将文件xxx复制到xxx,问题处理

    发布时报错提示: 错误 1 未能将文件 UpLoad\images\73CDC40ECCA44550BA8201D2AC187A46.jpg 复制到 obj\Debug\Package\Package ...

  7. IIS——发布网站

    当我们要上线一个网站时,不要把整个项目原封不动的发布到服务器,而要经过右键发布后,然后再将发布的文件路径配置到IIS~ 详细信息见链接:http://www.52ij.com/jishu/aspx/1 ...

  8. 图解——VS发布网站详细步骤

    1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...

  9. VS发布网站详细步骤

    1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...

随机推荐

  1. javaScript---RegExp

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦, ...

  2. vue_过滤器: 对要显示的数据进行特定格式化后再显示

    过滤器 对要显示的数据进行特定格式化后再显示 并未改变原本的数据,可是产生新的对应的数据 <!DOCTYPE html> <html lang="en"> ...

  3. ssh 免密登录

    一,单机秘密登录 进入/etc/ssh 文件夹 编辑sshd_config 文件(sshd_config是ssh 服务端文件,ssh_config是客户端文件) sudo vi sshd_config ...

  4. 【搜索1】P1605 迷宫

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  5. 关于select的id以及value传给后台的问题

    下面解释下后端为什么让传id的时候我们要怎末办? 定义一个空对象将他的值给select的值,option遍历的时候:value="item",这里的item是一个对象,也就是如果你 ...

  6. jenkins测试配置

  7. 快速体验 Laravel 自带的注册、登录功能

    快速体验 Laravel 自带的注册.登录功能 注册.登录经常是一件很伤脑筋的是,Laravel 提供了解决方案,可以直接使用它.试过之后,感觉真爽! 前提:本地已安装好了 PHP 运行环境.mysq ...

  8. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

    在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关 ...

  9. ajax的get和post请求 -- 基于flask 简单示例

    需求:在浏览器端输入姓名,将数据发送给后端,后端将内容追加到 user.json 中,并将该文件中的数据,返回到浏览器打印 1.浏览器端(html文件) index.html文件 <!DOCTY ...

  10. std::function 的使用说明

    转自: https://www.cnblogs.com/heartchord/p/5017071.html //////////////////// std::function   参考资料 • cp ...