Tag: msbuild

String Interpolation不会在TeamCity上构建

对于我支持的旧项目,我一直在进行一些现代化改造。 这包括各种各样的事情:将.NET Framework提升到4.6,以及其他升级。 我们有一些余地可以做的事情是进行语法升级,只要我们不改变业务逻辑。 我们最近还安装了Visual Studio 2015,以及最新最好的ReSharper,它揭示了“String Interpolation”现在是我们可以在代码中完成的事情。 对于那些不知道的人,字符串插值是string.Format调用的语法糖,如下所示: // Normal, pre-C#6 formatting: var foo = string.Format(“Some string {0}”, bar); // C#6 String Interpolation var foo = $”Some string {bar}”; 这非常有用,因为它使消息更容易阅读,并且通常占用更少的字符。 ……然而,TeamCity似乎不同意。 当我在提交中推送代码时,我收到以下错误: Directory\SomeFile.cs: error CS1056: Unexpected character ‘$’ [C:\ProjectDirectory\Project.Core\Project.Core.csproj] 从表面上看,似乎某种类型的前C#6构建器正在被击中,因为这是C#6的新function。 这就是我所观察到的,这就是为什么我认为这是正在发生的事情: 构建配置指向C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe这让我暂停,因为可能是我们的构建代理上安装了.NET 4.6。 但是,尝试从Microsoft安装程序直接安装.NET 4.6时,它会失败,因为.NET 4.6已安装在bulid代理上。 我们的构建配置的编译步骤也让我停下来。 注意构建引擎和框架版本的前两行分别是[exec] Microsoft (R) Build Engine version 4.6.1055.0 […]

如何同时为.Net 3.5和4编译项目

我需要为.Net 3.5和.Net 4.0编译一个项目。 这种做法最低摩擦的方法是什么? 如果我从另一个程序集引用此项目,如何确定目标是哪个运行时? 或者我应该直接引用二进制文件?

C#检查csproj中的属性是否“开始/结束”

我在我的csproj文件中设置一些配置,这些配置将针对不同的框架版本。 理想情况下,我想要’Debug – 3.5’,’Debug – 4.0’,’Release – 3.5’和’Release – 4.0’的配置。 在我的csproj文件中,我想做类似以下的事情: v3.5 </PropertyGroup v4.0 </PropertyGroup … check for "starts with Debug" to define Optimize etc. 但是,我不知道如何检查${Configuration}以特定字符串开头/结尾。 是否有捷径可寻? 编辑 :下面标记的答案指出我正确的方向,这导致我去: … setup pdb, optimize etc. … set target framework to 3.5 … and so on for Release and 4.0 variations

MSBuild:确保在任何其他构建步骤之前运行目标

我正在尝试更新AssemblyInfo.cs文件,以反映在任何其他构建步骤发生之前项目的下一个发布版本。 在我的项目文件中,我在结束前添加: PublishVersion.proj看起来像这样: 现在它确实在构建完成之前执行,但绝对不会在它启动之前执行,因为当我查看生成的exe时,它有一个在AssemblyInfo.cs中的文件版本在构建开始之前但.application文件和清单文件有各种引用新版本。 生成清单文件(构建开始前为1.0.0.0,构建后为1.0.0.4): … … … … … 那么如何确保我的目标在其他一切之前被执行? 对PublishVersion.proj进行更改有时似乎没有生效,我需要清理解决方案并在影响之前重新启动visual studio。

将间接引用的程序集复制到输出目录 – 缺少程序集

可能重复: Copy-local如何工作? 我有以下情况: 有一个名为OLAF.Tools的项目,该项目引用C:\ Program Files \ SQLXML 4.0 \ bin \ Microsoft.Data.SqlXml.dll中的Microsoft.Data.SqlXml。 Reference Copy Local属性设置为True。 当我在bin目录中构建该项目时,我可以看到OLAF.Tools.dll和Microsoft.Data.SqlXml.dll 有一个名为OLAF.Generator的控制台应用程序,该应用程序引用了OLAF.Tools(我使用Project选项卡添加了引用)。 当我在bin目录中构建该应用程序时,我只能看到OLAF.Generator.exe和OLAF.Tools.dll – 没有Microsoft.Data.SqlXml.dll,是什么让我感到满意。 另一个奇怪的事情是,即使该DLL丢失,应用程序也正常执行。 所以我的问题是: 为什么Microsoft.Data.SqlXml.dll没有复制到OLAF.Generator控制台应用程序的bin文件夹? 应用程序如何解析可以找到Microsoft.Data.SqlXml.dll的目录? 谢谢你,帕维尔 编辑1 :(在Marc Gravell的回应之后) @Marc Gravell :你的回答让我深思熟虑,因为我可以发誓我总能在主应用程序的bin目录中看到间接依赖的程序集。 恕我直言,我不同意你的意见 – 尽所能尊重:) 当然,引用不是物理级联的(我们正在谈论与类,接口等的强关系) – 这正是我在构建OLAF.Tools库时想要实现的。 该库提供了一个抽象级别,它包含工厂,一个工厂接受作为参数字符串并返回接口。 该接口的一个特定实现使用Microsoft.Data.SqlXml组件。 因此,OLAF.Generator使用位于OLAF.Tools中的接口,但不知道Microsoft.Data.SqlXml中的组件。 除此之外(我想我们都知道我试图在前一段中解释的内容),在构建应用程序时,应复制依赖程序集(如果Copy Local设置为TRUE)。 我刚刚编写了示例应用程序,Project B lib引用了Project A lib,而Project C(控制台应用程序)引用了Project B.在Project C的bin目录中,我可以看到所有:Project A.dll,Project B.dll&Project C.exe。 因此,在讨论的场景中,Microsoft.Data.SqlXml不会在OLAF.Generator […]

我应该如何在msbuild脚本中引用sn.exe?

我需要在构建完成后重新签署我的程序集(我已经完成了其他一些工作),所以我首先添加一个名为C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe的任务C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe 。 这必须适用于其他开发人员/环境,所以我希望我可以从该文件夹中复制sn.exe和sn.exe.config并将其存储在我们的代码存储库中,这样我就可以从已知的代码库中调用它的通用版本地点。 sn.exe在sdk目录之外独立崩溃,所以我想知道如何引用它而不知道它将在哪个路径下。 不同的人有不同的环境(x86 vs x64,不同的安装目录,不同的版本),所以我希望能够轻松地引用该工具的最新版本(或者任何版本)。 看起来像一个简单的工具,或许有另一种方法用另一个工具/命令/ msbuild任务签署程序集? 任何帮助,将不胜感激。

msbuild命令行尚不支持WebPublishMethod(FileSystem)

我正在使用Visual Studio Team Services(在visualstudio.com上)和运行VS2015的内部部署构建代理。 在我们的解决方案中,有3个网站使用文件系统发布配置文件到Dev,Test,Demo环境并应用了配置转换。 从本地VS2015 IDE中运行时,这些工作正常。 尝试从Team Services中的构建定义中的“ Visual Studio Build ”任务发布相同的配置文件时,会遇到以下错误: msbuild命令行尚不支持此特定WebPublishMethod(FileSystem)。 请使用Visual Studio进行发布。 为任务上的MSBuild参数设置了以下内容。 / p:DeployOnBuild = true /p:OutDir=$(build.artifactstagingdirectory)/ p:PublishProfile = TestProfile 花了几个小时谷歌搜索我找不到一种方法来让构建任务通过错误。 我们要做的是将网站部署到文件位置,并为适当的环境应用配置转换。 无法使用Webdeploy或FTP,只能使用文件系统部署。 是否可以通过配置转换获取文件系统发布配置文件,以便从来自Team Services的内部部署构建代理工作? 或者我需要以另一种方式解决这个问题吗? 建议的副本不会遇到相同的问题或错误消息。 在那个问题中,发布配置文件有效,只是没有提供op期望的文件,这个问题是关于这里报告的错误。

用于TFS持续集成的NuGet包

我正在尝试使我们的TFS构建过程从我们的解决方案项目中生成NuGet包。 我们的目标是创建一个私有包源,因此所有其他内部产品可以使用NuGet下载/更新框架。 到目前为止,我们已经运行了构建过程(很长一段时间)并对我们的库进行版本控制,唯一剩下的就是“ nuget pack ”所有项目。 到目前为止我尝试了什么: nuget spec * .csproj,然后是nuget pack * .nuspec; nuget spec * .dll,然后是nuget pack * .nuspec; nuget pack * .csproj直接(没有.nuspec文件); 所有这些似乎都有效,但所有这些似乎都失败了我实际需要它们成功的步骤。 我通过上述步骤实际得到的结果: 没有列出依赖¹, 没有列出参考²; 没有列出依赖关系¹, 没有列出引用²,目录中的所有dll都打包在同一个.nupkg上(whitout使用-IncludeReferencedProjects); (目前为止最好的)列出了一些依赖项¹, 没有列出引用,只有实际的项目dll在.nupkg上的lib文件夹中。 ¹: 依赖于我的意思是NuGet依赖,来自NuGet的包 ²: 参考我的意思是解决方案项目参考。 示例场景: Solution1.sln – ProjectA – ProjectB ProjectA有ProjectB的项目参考 。 我希望在生成的.nuspec上发生什么: ProjectA <- OK 1.2.0.0 < – OK ProjectA <- […]

如何从多个源文件创建MSBuild内联任务

我有几个CS文件(一个DLL项目),都在一个目录中,其中一个类扩展了ITask。 现在,很容易记录如何从一个源文件创建内联任务,但是可以从多个源文件中执行此操作吗? 我无法编译和使用DLL作为任务,如果我不必将所有源都塞入一个大的源文件,我更愿意。 我的目标是:

使用msbuild从网站部署中排除文件

我有一个使用msbuild部署的网站项目。 在项目中,有一些构建所需的文件和文件夹(例如web.config部件替换文件),但我不想部署到目标站点。 我能想到的最好的是删除这些文件的后期构建目标,但我想知道是否有办法将这些文件复制到输出文件夹中。