azure - cspack行为与msbuild不同

标签 azure azure-web-roles

使用Visual Studio 2012,Azure SDK 2.1,我试图找出创建csx文件夹以在Azure模拟器中运行的最佳方法。我的理解是,在打包Azure项目之前,不会创建csx文件夹。我可以从Visual Studio手动创建程序包,但这不是自动生成的选项。另一个选择是使用msbuild命令行创建软件包。这似乎有点费力,因为它实际上会进行构建,比重新包装要花更多时间。

因此,我认为cspack可能是一个更轻量级的选择。但是,当我使用以下命令行调用cspack时:

cspack.exe ServiceDefinition.csdef / copyOnly

我收到错误消息:需要为角色MyProjWeb的虚拟路径“Web /”指定物理目录。

但是,使用msbuild时我不会做任何类似的事情。我已经阅读了很多有关指定物理目录的信息,以及可能引起的一些混乱。因此,除非绝对必要,否则我不希望使用它,尤其是因为从msbuild构建时不需要指定它。

所以,我的主要问题是msbuild在做什么,而cspack在做什么?我该怎么做?
我的另一个问题是,在Azure模拟器中生成用于测试的csx文件夹的最简单方法是什么?

编辑-分辨率

我以为我会在这里写下如何解决这个问题,以防它对其他人有所帮助。我的问题的最大答案(感谢Chandermani和其他一些读物)是,根据一些规则,带有/ copyOnly的CSPack基本上是对文件夹结构的精美xcopy。如果不使用/ copyOnly,则还会使用精美的zip文件来创建程序包。不用抱怨,它很简单,但是一开始就知道这一点是很好的。您可以使用它来打包任何东西以使其不受天蓝色的影响,而不受限于可以在Visual Studio中构建的内容,例如一个PHP网站。使用msbuild的另一个好处是仅复制网站部署中的文件。

因此,当我使CSPack工作并指向mvc项目文件夹时,我发现它复制了包括源文件在内的所有内容。这不是我想要的。我可以找到的解决方案是先打包网站,然后将CSPack指向打包的文件。如果沿着这条路走,那么this link会非常有价值,因为它逐步描述了它。

因此,要么在Web项目中包含msbuild后步骤以打包文件,然后在Azure项目中包含后步cspack或在azure项目中包含msbuild后步骤以创建包( cspack,仅包含我的Web部署文件)。好吧,只需要执行一个步骤,然后让msbuild承担繁重的工作,这似乎更简单,更不容易出错。因此,我的azure项目中的发布步骤类似于:

"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe" /devfabric:shutdown > NUL
"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe" /devstore:shutdown > NUL
if $(ConfigurationName) == Debug set CONSTANTSPARAMETER=DEBUG
if $(ConfigurationName) == Release set CONSTANTSPARAMETER=
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe $(ProjectDir)$(ProjectFileName) /t:clean;publish /p:Configuration=$(ConfigurationName) /p:TargetProfile=cloud /p:OutputPath=bin\Cloud$(ConfigurationName) /p:VisualStudioVersion=11.0 /p:overwritereadonlyfiles=true /p:DefineConstants="%CONSTANTSPARAMETER%" /verbosity:minimal /p:PostBuildEvent=

前两行关闭了计算和存储仿真器。

接下来的两行设置预处理器常量。我发现使用msbuild行构建时#if DEBUG不再生效。我认为这是在创建软件包时剥离DEBUG的安全保护措施。我只使用过由自动生成系统创建的软件包,因此保持DEBUG恒定对我来说是安全的。

实际的msbuild行具有许多开关。我将描述不寻常的那些:

/ p:PostBuildEvent =

如果我们不将postBuildEvent设置为空,则相同的发布步骤将永远被调用。永远...

/p:VisualStudioVersion=11.0

Microsoft的那些聪明人使使用Visual Studio 2010和2012打开项目成为可能。这很棒,但是当您从命令行运行msbuild并出现讨厌的MSB4019错误消息时,它可能会带来极大的悲伤,因为它查找的是Azure工具使用了错误的Visual Studio文件夹。

另外,请注意,我使用云配置文件。由于我只使用了csx文件,因此此时使用本地还是云似乎都没有影响。当我以天蓝色运行时,请指定ServiceConfiguration.Local.cscfg。

编辑:最后,我从发布步骤中删除了这一步,并放入了我的自动构建中。我的初衷是从开发机上运行测试与自动化构建相同,但是发布步骤花了太长时间,并且在调试器下运行时, View 是从obj文件夹而不是proj文件夹获得的。在进行动态更改时必须复制。

未回答的问题

了解msbuild如何在此领域涉猎时如何减少知识冲突仍然是一件好事。它会为网站创建一个程序包并将其传递给CSPack吗?还是解析项目文件,然后将一些疯狂的参数传递给CSPack?同样,当您在调试器中运行azure项目时,它仅在csx文件夹中(而不是图像等)中的二进制文件中在模拟器中运行。它是如何做到的?看到带有Azure构建管道的图片的描述非常好,其中显示了整个部署过程的生命周期。这也可以解释为什么有两个二进制副本。另外,如果Visual Studio具有一个像Azure项目的packageOnBuild这样的项目标志,并且具有执行copyOnly或创建程序包的选项,那么这将容易得多。我认为未吃完的蛋糕毫无意义。 编辑:有一个DeployOnBuild设置可以添加到csproj。

最后,正如我提到的那样,这样做的全部目的是获得一个我可以指向仿真器的csx文件夹,以便可以在我的开发机上运行单元测试。我在构建机器上进行正式包装,因此在Visual Studio中并不需要它。因此,真的我不想打包任何东西,希望有一种更简单的方法来实现所有这些目标。

最佳答案

由于msbuild使用azure项目文件执行构建,因此它可以从项目文件中获取很多信息。

对于cspack,假定角色代码已编译并可用于打包。由于cspack不依赖于项目文件,因此它需要Web \ workerrole项目的代码路径的明确信息。 csdef文件不包含任何此类信息。我建议您是否要使用cspack。查看其documentation并尝试从命令行创建一个程序包以用于仿真器部署(CopyOnly选项)。找到正确的语法后,可以将其嵌入到构建脚本中。

关于azure - cspack行为与msbuild不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18117994/

相关文章:

azure - 如何在 Azure Devops 上添加新字段并继承旧(前身)字段的值?

Azure 函数错误索引方法 - 远程调试器崩溃

asp.net - Azure Asp.Net Redirect 破坏 session 变量

azure - 在azure计算模拟器中停止实例

azure - 如何使用网络设置启动 azure 网站

azure - Azure IOT 中心可以用于从某些设备读取(获取)数据吗?

c# - 如何挂载azure云盘?

azure - 使用 Azure WebRole 一段时间后,JSON 内容压缩将停止工作

c# - 当使用 WebRole.cs 运行 "OnStart()"中的自定义代码时,推荐的调用 base.OnStart() 的方法是什么?

azure - MS Azure Webrole - 如何指定 Web 根驱动器存储大小