我希望Azure Package文件成为成功签入版本的输出。我们希望能够从放置位置将这些包发布到Azure。
根据this post,我们只需要csdef
文件,以便在命令行中使用cspack创建包文件:
cspack “c:\<path to the csdeffile>\servicedefinition.csdef” /role:<Name of the role as defined in the csdef file>;<location of the binaries> /sites:<Name of the role>;<name of the site path>;<location of the website files>
但我想避免使用命令行。我知道可以使用CSPack
任务,但我一直在努力寻找更多信息。我无法在线查找任何规范,希望获得有关this Stackoverflow post的一些信息。
如何将上述cspack命令转换为CSPack构建任务?
我基于MSDN spec for cspack.exe提出了以下内容,但我不得不做出很多假设:
<PropertyGroup>
<VisualStudioVersion Condition=" '$(VisualStudioVersion)' == '' ">10.0</VisualStudioVersion>
<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Windows Azure Tools\2.2\</CloudExtensionsDir>
<Roles></Roles>
</PropertyGroup>
<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
<Target Name="CreatePackage" DependsOnTargets="Build">
<CSPack
ServiceDefinitionFile="MyCloudProject\ServiceDefinition.csdef"
Output="$(OutDir)Publish\$(ProjectName).cspkg"
PackRoles="MyRoleName"
SiteMapping="MyRoleName;MySiteName;MySitePath"
RoleProperties="MyRoleName;$(OutDir)Publish\MyProject.dll"
CopyOnly="false">
</CSPack>
</Target>
我收到以下构建错误:
C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ Windows Azure Tools \ 2.2 \ Microsoft.WindowsAzure.targets(351):无默认值 服务配置&#34; ServiceConfiguration.cscfg&#34;可以找到 该项目。
说实话,我真的不知道自己在做什么。我已经有一段时间了,所以任何指导都会受到赞赏。
复制cspkg文件将是easy enough,但我似乎无法弄清楚如何执行打包。
我们正在使用Visual Studio Online(基于云的TFS)。
修改
我们确实有云项目。这就是我们发布的方式(右键单击 - &gt;发布)。这显然不是理想的,因为它没有遵循&#34; Build Once&#34;战略,它为更大的团队增加了进一步的复杂性。
@Simon Opelt:使用CorePublish
目标是否需要更改构建定义?现在,构建定义使用特定的.build文件(为了执行NuGet还原),然后为解决方案中的所有项目运行Build目标:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutDir>$(MSBuildThisFileDirectory)bin</OutDir>
<Configuration>Release</Configuration>
<ProjectProperties>OutDir=$(OutDir);Configuration=$(Configuration);</ProjectProperties>
</PropertyGroup>
<ItemGroup>
<Solution Include="$(MSBuildThisFileDirectory)*.sln" />
</ItemGroup>
<Target Name="RestorePackages">
<Exec Command=""$(MSBuildThisFileDirectory).nuget\NuGet.exe" restore "%(Solution.Identity)"" />
</Target>
<Target Name="Clean">
<MSBuild Targets="Clean" Projects="@(Solution)" Properties="$(ProjectProperties)" />
</Target>
<Target Name="Build" DependsOnTargets="RestorePackages">
<MSBuild Targets="Build" Projects="@(Solution)" Properties="$(ProjectProperties)" />
</Target>
<Target Name="Rebuild" DependsOnTargets="RestorePackages">
<MSBuild Targets="Rebuild" Projects="@(Solution)" Properties="$(ProjectProperties)" />
</Target>
</Project>
这也构建并运行我们的测试项目。将云项目与CorePublish结合使用仍然允许这个吗?
答案 0 :(得分:1)
在构建中设置以下属性(通过命令行msbuild / p:开关,或属性页,或任何你喜欢的内容):
PublishDir = [您要将包发布到的文件夹]
PackageForComputeEmulator = true
然后添加一个目标,在构建后打开Publish,如下所示:
<Target
Name="BuildPackagesForAzure"
Condition="'$(DoPackagesInBuild)'=='True'"
DependsOnTargets="Publish"
AfterTargets="Build">
<Message Importance="high" Text="Doing Azure packaging in build." />
</Target>
答案 1 :(得分:1)
如果您的解决方案包含“云项目”此项目与Azure SDK绑定。如果您编辑项目,您可以看到它导入Microsoft.WindowsAzure.targets文件:
您将在任何.ccproj(云服务)项目中看到对此的引用
<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
此.targets文件为您执行CSPack:
我的Azure 2.6 SDK中的第3003行目标文件:
<CSPack
ServiceDefinitionFile="@(TargetServiceDefinition)"
Output="@(PublishServicePackage)"
PackRoles="@(Roles)"
SiteMapping="@(SiteMapping)"
RoleProperties="@(RoleProperties)"
ImportedModules="@(ImportedModules)"
CopyOnly="false"
>
</CSPack>
所以,你只需要正确设置就可以调用这个目标。
默认情况下,它已包含在您的解决方案中的项目中。搜索您的构建输出日志:
CorePublish: PackageWebRole
你应该看看是否正在调用CSPack:
[CorePublish] CorePublish: PackageWebRole = True
[18:56:39] :[CorePublish] Publishing starting...
[18:56:39] :[CorePublish] RolePlugins is ;
[18:56:39] :[CorePublish] Importedmodules is Diagnostics
[18:56:39] :[CorePublish] Publishing to '...'
[18:56:39] :[CorePublish] MakeDir
[18:56:39] :[MakeDir] Creating directory "...".
[18:56:39] :[CorePublish] TargetServiceDefinition is ...\Deploy\.ReleasePackage\ServiceDefinition.csdef
[18:56:39] :[CorePublish] TargetServiceConfiguration is ...\Deploy\.ReleasePackage\ServiceConfiguration.cscfg
[18:56:39] :[CorePublish] Roles is ...
[18:57:18] :[CorePublish] Copying the service configuration file.
[18:57:18] :[CorePublish] Copy
[18:57:18] :[Copy] Copying file from "...\Deploy\.ReleasePackage\ServiceConfiguration.cscfg" to "...\Deploy\.ReleasePackageapp.publish\ServiceConfiguration.Cloud.cscfg".
[18:57:18] :[CorePublish] Publishing process has completed.
(我删除了特定于我的构建的信息)
在文件中稍早指定输出:
<PublishServicePackage Include="$(PublishDir)$(TrailingSlashChar)$(ProjectName).cspkg" />
因此,如果您拥有SDK,则不必手动调用CSPack。您必须拥有SDK才能创建云项目。只需确保在构建机器上安装SDK!
答案 2 :(得分:0)
我无法使CSPack
任务正常工作。我遇到了无数问题,所以我直接执行了cspack.exe
:
<PropertyGroup>
<PackageCommand>
"C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\bin\cspack.exe" $(OutputPath)ServiceDefinition.csdef /role:MyRoleName;$(OutputPath) /sites:MyRoleName;MySiteName;$(OutputPath) /rolePropertiesFile:MyRoleName;$(OutputPath)RoleProperties.txt /out:$(OutputPath)Publish\MyRoleName.cspkg /useCtpPackageFormat
</PackageCommand>
</PropertyGroup>
<Target Name="CreatePackage" DependsOnTargets="Build" AfterTargets="Build">
<MakeDir Directories="$(OutputPath)Publish"></MakeDir>
<Message Text="Using cspack create a package for deployment..."></Message>
<Exec Command="$(PackageCommand)"></Exec>
</Target>