cspack行为与msbuild不同

时间:2013-08-08 04:37:10

标签: azure azure-web-roles

使用Visual Studio 2012,Azure SDK 2.1,我试图找出创建用于在azure模拟器中运行的csx文件夹的最佳方法。我的理解是,在打包Azure项目之前,不会创建csx文件夹。我可以从Visual Studio手动创建一个包,但这不是自动构建的选项。另一个选项是使用msbuild命令行创建包。这看起来有点沉重,因为它实际上会进行构建,这比仅重新打包更耗时。

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

cspack.exe ServiceDefinition.csdef / copyOnly

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

但是,使用msbuild时我不会做那样的事情。我已经阅读了很多关于指定物理目录的事情以及它可能导致的一些混淆。所以,除非绝对必要,否则我宁愿不使用它,特别是因为我不需要在从msbuild构建时指定它。

所以,我的主要问题是msbuild正在做什么,cspack没有做,我如何用cspack做同样的事情? 我的另一个问题是,在azure仿真器中生成用于测试的csx文件夹的最简单方法是什么?

修改 - 解决方案

我认为我会在这里解决我如何解决这个问题,以防它帮助其他人。我的问题的大答案(感谢Chandermani和其他一些阅读)是CSPack with / copyOnly基本上是根据一些规则对文件夹结构的奇特xcopy。如果没有使用/ copyOnly它然后也做一个花哨的zip来创建一个包。不抱怨,这很简单,但一开始就知道这一点很好。您可以使用它来包装任何天蓝色的东西,它与Visual Studio中可以构建的内容无关,例如:一个PHP站点。使用msbuild还有一个好处,就是只复制属于网站部署的文件。

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

所以,它要么在Web项目中有一个msbuild后步骤来打包文件,然后在我的Azure项目中进行后续步骤来cspack它,或者在我的azure项目中有一个msbuild后续步骤来创建package(执行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=

前两行关闭了计算和存储模拟器。

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

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

/ P:PostBuildEvent =

如果我们没有将postBuildEvent设置为空,那么相同的后续步骤将永远被调用。永远......

/p:VisualStudioVersion=11.0

微软那些聪明的家伙可以用Visual Studio 2010和2012打开项目。这很棒,但是当你从命令行运行msbuild并最终得到令人讨厌的MSB4019错误消息时会带来极大的悲伤,因为它是查找Azure工具的错误Visual Studio文件夹。

另外,请注意我使用云配置文件。由于我只是在csx文件之后,我现在使用本地或云是否有所作为。当我在azure中运行时,我指定了ServiceConfiguration.Local.cscfg。

编辑:最后,我将其从后期步骤中取出并放入我的自动构建中。我的初衷是从我的开发机器运行测试将与我的自动构建相同,但后期步骤花了太长时间,在调试器下运行时,视图来自obj文件夹而不是proj文件夹,这意味着我在飞行中进行更改时必须复制。

未回答的问题

理解msbuild在涉及这个领域时如何做些事情以减少知识摩擦仍然是一件好事。它是否为网站创建了一个包并将其传递给CSPack?或者它解析项目文件,然后将一些疯狂的参数传递给CSPack?此外,当您在调试器中运行azure项目时,它在模拟器中运行,只有csx文件夹中的二进制文件(而不是图像等)。它是如何做到的?很高兴看到一些描述与Azure构建管道的图片,其中显示了生命周期一直到部署。这也可以解释为什么有两个二进制副本。此外,如果Visual Studio有一个类似于Azure项目的packageOnBuild的项目标志,并且可以选择执行copyOnly或创建包,那么这将会变得更加容易。我觉得未吃的蛋糕没什么意义。 编辑:可以将一个DeployOnBuild设置添加到csproj。

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

1 个答案:

答案 0 :(得分:1)

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

对于cspack,假设角色代码已编译并可用于打包。由于cspack不依赖于项目文件,因此它需要有关web \ workerrole项目的代码路径的显式信息。 csdef文件不包含任何此类信息。我建议你是否想使用cspack。查看其documentation并尝试从命令行(CopyOnly选项)创建用于模拟器部署的包。一旦找到正确的语法,就可以将其嵌入到构建脚本中。