使用Visual 2012,Azure SDK 2.1,我试图找到创建csx文件夹以便在azure模拟器中运行的最佳方法。我的理解是,在打包Azure项目之前,不会创建csx文件夹。我可以从Visual手动创建包,但这不是自动生成的选项。另一个选项是使用msbuild命令行创建包。这看起来有点麻烦,因为它实际上会做一个比重新打包更耗时的构建。
所以,我认为cspack可能是一个更轻量级的选择。但是,当我使用以下命令行调用cspack时:
cspack.exe ServiceDefinition.csdef /copyOnly
我得到了一个错误:需要为角色MyProjWeb的虚拟路径'Web/‘指定物理目录。
但是,在使用msbuild时,我不会做类似的事情。我读过许多关于指定物理目录的内容,以及它可能造成的一些混乱。所以,除非绝对必要,否则我不想使用它,特别是因为我在从msbuild构建时不需要指定这一点。
所以,我的主要问题是,msbuild在做什么cspack没有做什么,我如何对cspack做同样的事情?我的另一个问题是,在azure模拟器中生成用于测试的csx文件夹的最简单方法是什么?
编辑-分辨率
我想我应该在这里写下我是如何解决这件事的,以防它对别人有帮助。我问题的主要答案(感谢Chandermani和其他阅读)是,按照某些规则,CSPack与/copyOnly基本上是对文件夹结构的一种奇特的x拷贝。如果不使用/copyOnly,那么它也会做一个漂亮的压缩来创建一个包。不抱怨,这是好的,它是简单的,但它是很好的了解这一点在一开始。您可以使用它来打包任何用于天蓝色的东西--它与Visual中可以构建的内容无关,例如PHP站点。使用msbuild有一个额外的好处,就是只复制作为网站部署一部分的文件。
所以,当我让CSPack工作并指向mvc项目文件夹时,我发现它复制了所有东西,包括源文件。这不是我想要的。我能找到的解决方案是首先打包网站,然后将CSPack指向打包的文件。如果您沿着这条路径走下去,那么此链接是非常有价值的,因为它一步一步地描述它。
因此,它要么在Web项目中有一个msbuild来打包这些文件,然后在我的Azure项目中有一个post来对它进行cspack,要么在我的azure项目中有一个msbuild步骤来创建包(做cspack,只包含我的web部署文件)。嗯,这似乎更简单,更少的错误,容易只是有一个岗位步骤,并让msbuild做繁重的工作。因此,在我的天青项目中的帖子步骤是这样的:
"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调试在使用msbuild行构建时不再生效。我认为这是安全保护,调试在创建包时会被剥夺。我只使用由自动构建系统创建的包,所以保持调试不变对我来说是安全的。
实际的msbuild行有许多开关。我会描述那些不寻常的:
/p:PostBuildEvent=
如果我们不将postBuildEvent设置为空,那么相同的post步骤将永远被调用。而且永远..。
/p:VisualStudioVersion=11.0
微软的那些聪明人使得用Visual 2010和2012打开项目成为可能。这是很棒的,但是当您从命令行运行msbuild时,可能会带来极大的悲伤,最后会收到讨厌的MSB4019错误消息,因为它在错误的Visual文件夹中查找Azure工具。
另外,请注意,我使用了云概要文件。由于我只是在csx文件之后,所以无论在此时使用本地还是云,似乎都没有什么区别。当我在蔚蓝中运行时,我指定了ServiceConfiguration.Local.cscfg。
编辑:,最后,我把它从post步骤中拿出来,放到了我的自动构建中。我最初的意图是,在我的dev机器上运行测试将与我的自动构建相同,但是post步骤花费了太长时间,视图来自obj文件夹,而不是在调试器下运行时的proj文件夹,这意味着我在动态更改时必须复制。
未回答的问题
了解msbuild是如何在涉足这一领域时减少知识摩擦仍然是很好的。它是否为网站创建了一个包并将其传递给CSPack?或者它解析项目文件,然后将一些疯狂的参数传递给CSPack?另外,当您在调试器中运行一个azure项目时,它只在csx文件夹中的二进制文件(而不是图像等)中运行在模拟器中。它是怎么做到的?很高兴看到Azure构建管道的一些描述,它展示了整个部署过程的生命周期。这也可以解释为什么有两个二进制文件的副本。另外,如果Visual为Azure项目设置了一个项目标志,比如packageOnBuild,并提供了执行copyOnly或创建包的选项,那么这就会简单得多。我觉得没有必要吃未吃的蛋糕。编辑:有一个DeployOnBuild设置,可以添加到csproj中。
最后,正如我所提到的,这是为了获得一个csx文件夹,我可以将模拟器指向这个文件夹,以便在我的dev机器上运行我的单元测试。我在构建机器上进行正式的打包,所以在Visual中并不真正需要它。所以,我真的不想包装任何东西,我希望有一个更容易的方法来实现这一切。
发布于 2013-08-08 06:11:06
由于msbuild使用azure项目文件来执行构建,因此它可以从项目文件中派生出大量信息。
对于cspack,假设角色代码已经编译并可用于打包。因为cspack不依赖于项目文件,所以它需要一个明确的信息来显示web\workerrole项目的代码路径。csdef文件不包含任何此类信息。我建议如果你想用cspack。查看它的文档并尝试从命令行(CopyOnly选项)创建一个用于模拟器部署的包。一旦找到正确的语法,就可以将其嵌入到构建脚本中。
https://stackoverflow.com/questions/18117994
复制相似问题