我一开始在 SO 上发布了这个,但没有任何回应。 在这里重新发布,希望有人可以对正在发生的事情有所了解。
我有一个gulp publish
任务,它在发布过程中为生产服务器准备资产。 在project.json
这工作成功:
"scripts": {
"prepublish": [ "npm install", "gulp publish" ],
"postpublish": [
"dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%",
"dotnet razor-precompile --configuration %publish:Configuration% --framework %publish:TargetFramework% --output-path %publish:OutputPath% %publish:ProjectPath%"
]
}
通过 VS2017 迁移到带有csproj
MSBuild 给出了我期望的等价物:
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
<Exec Command="npm install" />
<Exec Command="gulp publish" />
</Target>
在执行npm install
和gulp publish
命令的同时,它们似乎运行得太晚了,无法将它们生成的资产包含在实际发布过程中。
如果我刚刚克隆存储库并连续发布两次,则第二次成功,因为资产是从第一次发布中生成的,因此包含在第二次发布中。
我的第一个想法是通过设置BeforeTargets="Build"
在发布过程中更早地跳转,但这不仅不起作用,而且即使我们在每个构建中运行这些命令,甚至在开发过程中也是如此。 就好像发布过程在开始时拍摄文件系统的快照,并且在发布过程中的任何地方都不检查添加到文件系统的文件。 对于这个项目,我们需要能够从新克隆的存储库构建,因为这就是构建服务器上发生的事情( git clone
-> dotnet restore
-> dotnet publish -c Release -o PublishOutput
)。
有效的是设置BeforeTargets="Restore"
。 这会在构建服务器上完美生成所有内容,大概是因为gulp publish
生成的资产在dotnet publish
命令之前存在于文件系统中。 当然,我们不想在每个dotnet restore
上实际生成资产!
有没有办法挂钩早于“PrepareForPublish”的目标,或者是否有人甚至有您可以锁定的 MSBuild 目标列表?
@svallis这是由https://github.com/dotnet/cli/issues/5498和https://github.com/aspnet/websdk/issues/114跟踪的在提供开箱即用的更好解决方案之前,我正在使用一种解决方法(
非常感谢@nil4 - 进行了搜索,但正在我没有检查的回购中跟踪问题,感谢
在这里关闭它,因为它在其他地方被跟踪
最有用的评论
@svallis这是由https://github.com/dotnet/cli/issues/5498和https://github.com/aspnet/websdk/issues/114跟踪的在提供开箱即用的更好解决方案之前,我正在使用一种解决方法(