我有一个.NET MVC项目,我正在尝试使用Jenkins进行部署.
我一直让Jenkins运行msbuild,然后使用RoboCopy复制生成的文件.我想切换到只使用发布配置文件.发布配置文件在我的本地计算机上使用Visual Studio正常工作,但在Jenkins主机上它使用msbuild失败.
它给出的错误是
ASPNETCOMPILER:错误ASPRUNTIME:找不到路径'C:\ Program Files(x86)\ Jenkins\jobs\myProject\workspace\myProject\_ obj\Debug\AspnetCompileMerge\Source\bin\roslyn\csc.exe'的一部分.[C:\ Program Files(x86)\ Jenkins\jobs\myProject\workspace\myProject\calendar.csproj]
我正在使用Microsoft.Net.Compilers nuget包来引入C#编译器,因为项目中的一些协作者仍在Visual Studio 2013上,但我们在项目中使用了C#6语言功能.
事实上,在添加发布标志之前,项目在jenkins上使用MSBuild构建得很好.它只是在添加/p:DeployOnBuild=true;PublishProfile=MyProfile它开始失败的设置之后......但是使用Visual Studio,发布步骤工作得很好,而且roslyn编译器甚至被复制到本地机器上的obj\Debug\AspnetCompileMerge\Source\bin \文件夹中.是什么赋予了?
老实说,既然msbuild14在Jenkins服务器上可用,它可能甚至不需要 roslyn csc.exe文件.有没有办法让msbuild忽略它?
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<LastUsedBuildConfiguration>Debug</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<publishUrl>\\myserver\someshare\mysite</publishUrl>
<DeleteExistingFiles>True</DeleteExistingFiles>
<PrecompileBeforePublish>True</PrecompileBeforePublish>
<EnableUpdateable>True</EnableUpdateable>
<DebugSymbols>False</DebugSymbols>
<WDPMergeOption>DonotMerge</WDPMergeOption>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
我试过更新编译器包.
我在.csproj文件中添加了步骤,将丢失的编译器文件强制复制到AspnetCompileMerge目录(我已经将它们复制到bin\roslyn目录以解决 另一个问题)
<Target Name="CopyRoslynFiles" AfterTargets="BeforeBuild">
<ItemGroup>
<RoslynFiles Include="$(SolutionDir)packages\Microsoft.Net.Compilers.1.1.1\tools\*" Exclude="$(SolutionDir)packages\Microsoft.Net.Compilers.1.1.1\tools\*.sys" />
</ItemGroup>
<MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
<MakeDir Directories="$(WebProjectOutputDir)\obj\$(Configuration)\AspnetCompileMerge\Source\bin\roslyn" />
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" /> …Run Code Online (Sandbox Code Playgroud) 因此,我使用gatsby-mdx插件从 MDX 文件创建站点。我想在 SitePage 对象和 Mdx 对象之间创建一个关联,以便我可以对 SitePage 边缘执行一个 graphQL 查询以构建站点导航。
我的大部分代码都在 TypeScript 中,所以如果您想知道 WTF 是什么类型的注释,请忽略任何类型注释。
我的第一个想法是使用onCreateNodeAPI,获取 MDX 节点,然后使用createNodeField操作将其添加到 SitePage 。这一切的伟大工程,但盖茨比,MDX插件增加了大量的其他信息,以它们的节点以后使用setFieldsOnGraphQLNodeTypeAPI(发生后的onCreateNodeAPI)。我希望这些字段(例如 frontmatter 和 tableOfContents)在以后的 graphql 查询中可用,但它们没有使用这种方法。
setFieldsOnGraphQLNodeType我想我可以像 gatsby-mdx 扩展 Mdx 节点一样扩展 SitePage 对象。
我在这里遇到的关键问题是我不知道如何创建 Mdx GraphQL 节点类型。
export const setFieldsOnGraphQLNodeType = ({type, actions, getNodes}: any, pluginOptions: any) => {
if (type.name === "SitePage") {
const {createParentChildLink} = actions
return new Promise((resolve) => …Run Code Online (Sandbox Code Playgroud) 我正试图让我的项目使用Geb在无头模式下运行Chrome的beta频道.
我可以使用Geb Gradle示例项目重现该问题.
在GebConfig.groovy中,我有这个块来定义chrome:
environments {
// run via “./gradlew chromeTest”
// See: http://code.google.com/p/selenium/wiki/ChromeDriver
chrome {
driver = {
ChromeOptions options = new ChromeOptions()
DesiredCapabilities capabilities = DesiredCapabilities.chrome()
String chromiumPath = "/usr/bin/chromium-browser"
String macChromePath = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
String macCanaryChrome = "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"
def chromiumBinary = new File(chromiumPath)
def isAgent = chromiumBinary.exists()
def macChromeBinary = new File(macChromePath)
if (isAgent) {
options.setBinary(chromiumBinary) //Set binary using file to avoid NoClassDefFound error on mac
} else if (macChromeBinary.exists()) …Run Code Online (Sandbox Code Playgroud) 我有一个自定义taglib需要调用服务方法,而该方法又使用Wslite插件来发送和接收SOAP消息.taglib看起来像这样.
class myTagLib {
def myService
def thisTag = {
def parametersFromService = myService.method("argument")
out << render(template:'/myFolder/myView',
model:parametersFromService)
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为这个taglib构建一个测试.我的测试是这样的:
void testThisTag() {
def appliedTagLib = applyTemplate('<thisTag attr="value" />')
def parametersFromService = myService.method("argument")
def renderedTemplate = render(template:'/myFolder/myView',
model:parametersFromService)
assertEquals appliedTagLib, renderedTemplate
}
Run Code Online (Sandbox Code Playgroud)
我开始把它写成单元测试.我尝试了简单的MockFor(MyService)注释,以及以更精细的方式模拟它们,但是myService当taglib试图调用它时,对象总是为null.
鉴于此,我决定最好将其作为集成测试; 这将让我访问插件和服务,没有问题.
但是,只有在测试类扩展GroovyPagesTestCase时,applyTemplate方法才有效.如果你这样做,渲染方法不起作用,至少不在集成测试中.我知道ApplyTemplate在和渲染做对方一起工作,在单元测试的标签库,因为我测试过的其他标签库这样.
我好像在一块岩石和一块坚硬的地方之间.要访问他们调用的服务,插件和SOAP服务,我需要进行集成测试.要使用applyTemplate()方法,我需要扩展GroovyPagesTestCase,但这会破坏render方法.我已经尝试添加import grails.test.GroovyPagesTestCase到我的测试类,然后从中调用applyTemplate方法,但这会导致缺少方法异常.
思考?
Grails版本是2.0.1,但如果有帮助(我们的网站处于转换状态),我可以升级到2.2.1.
---附录----- elias建议我可以注入一个grails.gsp.PageRenderer实例来获取一个有效的渲染方法.我试过构建一个:
import org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine
import grails.gsp.PageRenderer
Run Code Online (Sandbox Code Playgroud)
...
def pageRenderer
Run Code Online (Sandbox Code Playgroud)
...
void setUp() {
context = …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个Grails应用程序,它可以显示TIFF文件和其他图像的预览.
这些图像是从SOAP服务构造的,它为我提供了图像的字节.在一个服务方法中,我取byte [],从中构造一个ByteArrayInputStream,然后从中创建一个BufferedImage.
def inputStream = new ByteArrayInputStream(bytes)
BufferedImage originalImage = ImageIO.read(inputStream)
ImageIO.write(originalImage, 'png', response.outputStream)
Run Code Online (Sandbox Code Playgroud)
对于JPG,我可以轻松地将图像作为img标记的src流式传输到浏览器.但是,我需要将图像转换为其他格式(最好是JPG或PNG),以使它们成为标记的src.
我知道我需要JAI才能读取TIFF文件.jai_core.jar,jai_codec.jar文件在我的classpath中.事实上,因为我在Mac OSX上,它们是自动安装的.但是,当我运行grails应用程序并尝试从SOAP服务接收的字节构造TIFF图像时,我收到此错误:
| Error 2013-06-18 15:23:38,135 [http-bio-8080-exec-10] ERROR errors.GrailsExceptionResolver - IllegalArgumentException occurred when processing request: [GET] /BDMPlugin/BDMPlugin/displayImageFromRef - parameters:
pageRef: 28:22072FBCA0A8889D9C041D76A588BCF4DCB40376A23B5FD5C301378C8E66EB9F4933A5DFCA46365F927D9E91B337B6E1E980FB4406644801
type: TIFF
im == null!. Stacktrace follows:
Message: im == null!
Line | Method
->> 1457 | write in javax.imageio.ImageIO
- - - - - - - - - - - - - - - - - - - …Run Code Online (Sandbox Code Playgroud) 我自定义grails插件的依赖关系没有被我安装插件的项目继承和解决.
grails maven-install 使插件在mavenLocal()源中可用所以,我一直在尝试创建一个自定义grails插件供我大学内部使用.
我真的很喜欢它,如果将插件放入BuildConfig.groovy文件的插件关闭会自动安装不仅仅是插件,而是在BuildConfig.groovy文件中为插件定义的所有依赖项(或者,在打包后,它的依赖项.groovy文件).
查看说明,我已经在存储库闭包中为我的项目设置了BuildConfig.groovy文件:
flatDir name:'my-plugin', dirs:'/Users/me/workspace-ggts/myplugin'
Run Code Online (Sandbox Code Playgroud)
然后将其添加到插件闭包中:
compile(":grails-my-plugin:0.1")
Run Code Online (Sandbox Code Playgroud)
这确实正确安装了插件,但它没有解决任何插件的依赖项或所需的插件.这是插件的BuildConfig.groovy文件中的三个主要闭包:
repositories {
grailsCentral()
mavenCentral()
mavenRepo "http://www.mygrid.org.uk/maven/repository"
def jbossResolver = new org.apache.ivy.plugins.resolver.URLResolver()
jbossResolver.addArtifactPattern("https://repository.jboss.org/nexus/content/groups/public-jboss/com/sun/media/[module]/[revision]/[artifact]-[revision].[ext]")
jbossResolver.addArtifactPattern("https://repository.jboss.org/nexus/content/groups/public-jboss/javax/media/[module]/[revision]/[artifact]-[revision].[ext]")
resolver jbossResolver
}
dependencies {
compile (
[group:'javax.media', name:'jai-core', version:'1.1.3'],
[group:'com.sun.media', name:'jai-codec', version:'1.1.3']
)
compile "net.java.dev.jai-imageio:jai-imageio-core-standalone:1.2-pre-dr-b04-2013-04-23" //this jar comes from the mygrid mavenRepo
}
plugins {
build(":tomcat:$grailsVersion",
":release:1.0.0") {
export = false
}
compile ":spring-security-core:1.2.7.3"
compile ":wslite:0.7.2.0"
}
Run Code Online (Sandbox Code Playgroud)
如果我使用插件运行grails run-app,它会解决所有这些依赖关系.只有当插件安装到项目时,自动依赖项解析才会失败.
我已经尝试使插件成为maven工件,并将其复制到我的本地存储库.在这些情况下,我flatDir从repositories …
我们公司使用的大多数域对象都有一些共同的属性.它们代表创建对象的用户,最后更新对象的用户以及用于执行此操作的程序.
在利益DRY荷兰国际集团我的领域类,我想找到一些方法来添加相同beforeInsert和更新前的逻辑具有这些列的所有领域类不与那些不干扰.
我是怎么想这样做的,就是使用一个带有自己的beforeInsert和beforeUpdate方法的Mixin.我知道你可以在域类上使用Mixins.
package my.com
import my.com.DomainMixin
@Mixin(DomainMixin)
class MyClass {
String foo
String creator
String updater
static constraints = {
creator nullable:false
updater nullable:false
}
}
package my.com
class DomainMixin {
def beforeInsert() {
this.creator = 'foo'
this.updater = 'foo'
}
def beforeUpdate() {
this.updater = 'bar'
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试表明,当以这种方式实现时,beforeInsert方法实际上没有被触发.
旁注:我也知道可以使用metaClass 在BootStrap.groovy文件中添加方法,但我的好奇心已经变得更好了,我真的想看看mixin是否有效.请随意告诉我,这是更好的方法,我不应该混淆男人不应该的地方.
grails ×4
groovy ×2
c# ×1
dependencies ×1
gatsby ×1
geb ×1
grails-2.2 ×1
grails-orm ×1
graphql ×1
graphql-js ×1
ivy ×1
jai ×1
javascript ×1
jenkins ×1
mixins ×1
msbuild ×1
plugins ×1
selenium ×1
testing ×1
unit-testing ×1